Java WELD-000044无法从org.jboss.WELD.bean-se-module-ProducerField获取实例

Java WELD-000044无法从org.jboss.WELD.bean-se-module-ProducerField获取实例,java,jpa-2.0,cdi,entitymanager,weld,Java,Jpa 2.0,Cdi,Entitymanager,Weld,我试图在DAO类中注入一个实体管理器,并使用weld容器对其进行测试,但我一直得到以下异常: org.jboss.weld.exceptions.NullInstanceException:weld-000044无法从org.jboss.weld.bean-se-module-ProducerField-com.playdry.cdi_tutorial.beans.Resources.em获取实例 在org.jboss.weld.bean.builtin.CallableMethodHandle

我试图在DAO类中注入一个实体管理器,并使用weld容器对其进行测试,但我一直得到以下异常:

org.jboss.weld.exceptions.NullInstanceException:weld-000044无法从org.jboss.weld.bean-se-module-ProducerField-com.playdry.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_$$\uJavassist_2.createQuery(EntityManager_$$\uJavassist_2.java) 在com.playdy.cdi_tutorial.model.EventDAO.getAllEvents(EventDAO.java:22)上 在com.playdy.cdi_tutorial.beans.ValidationService.validateEventNumbers(ValidationService.java:23)上 在com.playdy.cdi_tutorial.beans.MyFactory.sayHi(MyFactory.java:15)上 在com.playdry.cdi_tutorial.beans.MyFactoryTest.When_说再见(MyFactoryTest.java:26) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在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.runReflectVeCall(FrameworkMethod.java:44) 位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(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;
       ...
    }
}

制作人阶层是这样的:

@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不是空的

附言:我用的是WeldjunitRunner(http://www.hostettler.net/blog/2012/04/02/how-to-test-a-jsf-named-bean/)运行我的测试

我非常感谢你的帮助


谢谢

我建议用它来做这种测试。它使容器内测试变得非常简单(和快速)。您可以正常注入EntityManager,剩下的由Arquillian负责……

谢谢,但这正是我想要避免的。我不需要应用服务器提供的所有服务,我只需要能够注入托管bean,包括实体管理器本身。我认为问题与@PersistenceContext注释未被Weld容器“识别”有关。我将尝试使用另一个制作人,在EntityManagerFactory的帮助下创建EntityManager。好的,但只要有时间为Arquillian尝试一下就可以了。测试运行得非常快,您可以部署到正在运行的服务器(远程)或在测试中启动和停止服务器(托管)。有一个关于测试持久性的教程:关于启动所有服务,如果您使用的是Glassfish或JBoss,它们启动得非常快,因为不会加载未使用的服务。