【问题标题】:WELD-000044 Unable to obtain instance from org.jboss.weld.bean-se-module-ProducerFieldWELD-000044 无法从 org.jboss.weld.bean-se-module-ProducerField 获取实例
【发布时间】:2012-10-25 20:09:37
【问题描述】:

我正在尝试在 DAO 类中注入一个实体管理器并使用焊接容器对其进行测试,但我不断收到以下异常:

org.jboss.weld.exceptions.NullInstanceException: WELD-000044 无法从 org.jboss.weld.bean-se-module-ProducerField-com.playground.cdi_tutorial.beans.Resources.em 获取实例 在 org.jboss.weld.bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:60) 在 org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43) 在 javax.persistence.EntityManager_$$_javassist_2.createQuery(EntityManager_$$_javassist_2.java) 在 com.playground.cdi_tutorial.model.EventDAO.getAllEvents(EventDAO.java:22) 在 com.playground.cdi_tutorial.beans.ValidationService.validateEvenNumbers(ValidationService.java:23) 在 com.playground.cdi_tutorial.beans.MyFactory.sayHi(MyFactory.java:15) 在 com.playground.cdi_tutorial.beans.MyFactoryTest.should_say_bye(MyFactoryTest.java:26) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 在 org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 在 org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:236) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

我尝试如下注入实体管理器:

 @Inject
 @EmProducer
 EntityManager em;

EmProducer 如下所示:

@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface EmProducer {

    public static final String UNIT_NAME = "cdi-tutorial";

}

生产者类看起来像这样:

public class Resources {

 @Produces
 @EmProducer
 @PersistenceContext(unitName = EmProducer.UNIT_NAME)
 private EntityManager em;
       ...
    }

在我的测试中,当这行代码被命中 Query q = em.createQuery("from Employee");我得到了上面的例外。但实体管理器 em 不为空。

PS:我使用 WeldJUnit4Runner (http://www.hostettler.net/blog/2012/04/02/how-to-test-a-jsf-named-bean/) 来运行我的测试。

非常感谢您的帮助。

谢谢!

【问题讨论】:

    标签: java jpa-2.0 cdi entitymanager weld


    【解决方案1】:

    我建议使用Arquillian 进行此类测试。它使容器内测试变得非常容易(而且快速)。您可以正常注入 EntityManager,其余的由 Arquillian 处理...

    【讨论】:

    • 谢谢,但这正是我想要避免的。我不需要应用服务器提供的所有服务,我只需要能够注入托管 bean,包括实体管理器本身。我认为问题与 Weld Container 未“识别”@PersistenceContext 注释这一事实有关。我将尝试使用另一个 Producer,在 EntityManagerFactory 的帮助下创建 EntityManager。
    • 好的,但只要有时间就试试 Arquillian。测试运行得非常快,您可以部署到正在运行的服务器(远程)或在测试中启动和停止服务器(托管)。有一个测试持久性的教程:arquillian.org/guides/testing_java_persistence 关于启动所有服务,如果您使用的是 Glassfish 或 JBoss,它们启动非常快,因为不加载未使用的服务。
    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多