gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:41:32 29 4
gpt4 key购买 nike

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

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 方法) 在 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)实体管理器:

 @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");我得到上面的异常(exception)。实体管理器 em 不为空。

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

非常感谢您的帮助。

谢谢!

最佳答案

我建议使用 Arquillian对于这种测试。它使容器内测试变得非常简单(而且快速)。你可以正常注入(inject) EntityManager,Arquillian 会处理剩下的事情......

关于java - WELD-000044 无法从 org.jboss.weld.bean-se-module-ProducerField 获取实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13241445/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com