java WELD000044无法从组织获取实例。jboss。焊接beansemoduleProducerField
我试图在DAO类中注入一个实体管理器,并使用weld容器对其进行测试,但我一直遇到以下异常:
组织。jboss。焊接例外。NullInstanceException:WELD-000044无法从组织获取实例。jboss。焊接bean se模块ProducerField com。游戏场cdi_教程。豆。资源。相对长度单位 在org。jboss。焊接豆内置的。CallableMethodHandler。调用(CallableMethodHandler.java:60) 在org。jboss。焊接util。CleanableMethodHandler。调用(CleanableMethodHandler.java:43) 在javax。坚持不懈EntityManager_$$javassist_2。createQuery(EntityManager_$$javassist_2.java) 在com上。游戏场cdi_教程。模型EventDAO。getAllEvents(EventDAO.java:22) 在com上。游戏场cdi_教程。豆。验证服务。ValidateEventNumbers(ValidationService.java:23) 在com上。游戏场cdi_教程。豆。我的工厂。sayHi(MyFactory.java:15) 在com上。游戏场cdi_教程。豆。我的工厂测试。应该说再见吗(MyFactoryTest.java:26) 在阳光下。反映NativeMethodAccessorImpl。invoke0(本机方法) 在阳光下。反映NativeMethodAccessorImpl。调用(NativeMethodAccessorImpl.java:57) 在阳光下。反映DelegatingMethodAccessorImpl。调用(DelegatingMethodAccessorImpl.java:43) 在爪哇。朗,反思一下。方法调用(Method.java:601) 在org。朱尼特。跑步者。模型框架方法1美元。RunReflectVeCall(FrameworkMethod.java:44) 在org。朱尼特。内部的跑步者。模型可反射的。运行(ReflectVeCallable.java:15) 在org。朱尼特。跑步者。模型框架方法。explosive调用(FrameworkMethod.java:41) 在org。朱尼特。内部的跑步者。声明。调用方法。评估(InvokeMethod.java:20) 在org。朱尼特。跑步者。BlockJunitClassRunner。runNotIgnored(BlockJUnit4ClassRunner.java:79) 在org。朱尼特。跑步者。BlockJunitClassRunner。runChild(BlockJUnit4ClassRunner.java:71) 在org。朱尼特。跑步者。BlockJunitClassRunner。runChild(BlockJUnit4ClassRunner.java:49) 在org。朱尼特。跑步者。ParentRunner 3美元。run(ParentRunner.java:193) 在org。朱尼特。跑步者。ParentRunner 1美元。时间表(ParentRunner.java:52) 在org。朱尼特。跑步者。家长跑步者。runChildren(ParentRunner.java:191) 在org。朱尼特。跑步者。家长跑步者。访问$000(ParentRunner.java:42) 在org。朱尼特。跑步者。ParentRunner 2美元。评估(ParentRunner.java:184) 在org。朱尼特。跑步者。家长跑步者。run(ParentRunner.java:236) 在org。日食jdt。内部的junit4。跑步者JUnit4TestReference。运行(JUnit4TestReference.java:50) 在org。日食jdt。内部的朱尼特。跑步者测试执行。运行(TestExecution.java:38) 在org。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。runTests(RemoteTestRunner.java:467) 在org。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。runTests(RemoteTestRunner.java:683) 在org。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。运行(RemoteTestRunner.java:390) 在org。日食jdt。内部的朱尼特。跑步者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不是空的
附言:我用的是WeldJunitRunner(http://www.hostettler.net/blog/2012/04/02/how-to-test-a-jsf-named-bean/)运行我的测试
我非常感谢你的帮助
谢谢
# 1 楼答案
我建议使用Arquillian进行这种测试。它使容器内测试变得非常简单(和快速)。你可以正常注射EntityManager,剩下的由Arquillian负责