org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: 参数resolvedBean 不能为空
Posted
技术标签:
【中文标题】org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: 参数resolvedBean 不能为空【英文标题】:org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument resolvedBean must not be null 【发布时间】:2016-02-26 18:13:05 【问题描述】:从 JPA 2.1 开始,可以将 EJB 注入到实体侦听器中。然而,WildFly 9.0.2 final 失败并出现以下异常。
15:41:12,125 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 149) MSC000001: Failed to start service jboss.persistenceunit."Test.ear/Test-ejb.jar#Test-ejbPU": org.jboss.msc.service.StartException in service jboss.persistenceunit."Test.ear/Test-ejb.jar#Test-ejbPU": javax.persistence.PersistenceException: [PersistenceUnit: Test-ejbPU] Unable to build Hibernate SessionFactory
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:172)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117)
at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:665)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: Test-ejbPU] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:877)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:805)
at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154)
... 7 more
Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument resolvedBean must not be null
at org.jboss.weld.util.Preconditions.checkArgumentNotNull(Preconditions.java:40)
at org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:813)
at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:375)
at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:386)
at org.jboss.weld.injection.producer.ResourceInjector$1.proceed(ResourceInjector.java:70)
at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:72)
at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:121)
at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory$BeanMetaData.<init>(BeanManagerListenerFactory.java:65)
at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory$BeanMetaData.<init>(BeanManagerListenerFactory.java:54)
at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory.buildListener(BeanManagerListenerFactory.java:40)
at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.resolveCallbacks(LegacyCallbackProcessor.java:161)
at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.processCallbacksForEntity(LegacyCallbackProcessor.java:66)
at org.hibernate.jpa.event.spi.JpaIntegrator.integrate(JpaIntegrator.java:140)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:802)
... 9 more
15:41:12,125 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 2) WFLYCTL0013: Operation ("full-replace-deployment") failed - address: ([]) - failure description: "WFLYCTL0080: Failed services" => "jboss.persistenceunit.\"Test.ear/Test-ejb.jar#Test-ejbPU\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"Test.ear/Test-ejb.jar#Test-ejbPU\": javax.persistence.PersistenceException: [PersistenceUnit: Test-ejbPU] Unable to build Hibernate SessionFactory
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: Test-ejbPU] Unable to build Hibernate SessionFactory
Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument resolvedBean must not be null"
问这个问题只是因为我在某处读到自 WildFly 8.2 以来可以将 EJB 和/或 CDI 事件注入实体侦听器。因此,我觉得我哪里出错了。
与成功的 GlassFish 不同(至少在 GlassFish 4.1 上),WildFly 是否需要我们额外注意将 EJB 和/或 CDI 事件注入实体侦听器?
我已经在一个完全空白的企业应用程序上对此进行了测试,该应用程序只有一个空白会话 bean(无状态),该会话 bean 将被注入到实体侦听器和一些 JPA 实体中。
听者:
public class ProductListener
@Inject
private TestService service;
@PostPersist
public void postPersist()
EJB 完全空白:
@Stateless
public class TestBean implements TestService
如果注入点 (TestService
) 被移除,异常就会消失。
用@ApplicationScoped
或@Singleton
指定侦听器也无济于事(实际上不需要这样做)。
Hibernate 版本是 5.0.5 最终版本,Weld 版本是 2.2.16。
更新 1:
更新到 Hibernate 5.0.6 final。
更新 2:
该问题在 2016 年 1 月 29 日星期五发布的 WildFly 10.0.0 final 中仍然存在,其中包含 Hibernate 5.0.7 final / Weld 2.3 final。
更新 3:
根据issue status,这已在 Hibernate 5.1.0 final 中修复,它应该在 WildFly 10.0.0 final 中相应地工作,但它仍然无法正常工作,但同样的异常 - 没有改进。
【问题讨论】:
eclipselink 与休眠的处理方式可能有所不同。你能分享一下你的TestService
实现吗?
TestService
的实现是TestBean
,完全如问题所示完全留空(没有方法,里面没有其他内容)。应用程序本身是一个空白项目,只有一个空的无状态会话 bean (TestService
)、一个实体侦听器和几个实体,仅此而已。尝试部署应用程序时引发异常。
我认为这是一个已知问题hibernate.atlassian.net/browse/HHH-8706 & issues.jboss.org/browse/WFLY-2387
@TomaszKnyziak :不包括 EJB,CDI 事件是 CDI 工件,因此将它们注入实体侦听器需要 @Inject
强制。因此,将 @Inject
替换为 @EJB
以将 EJB 注入实体侦听器仍然不是一种补救措施,因为 CDI 事件仍然需要 @Inject
,尽管该部分未包含在问题中。
@Tiny - 没有争论将通用 CDI 注入实体侦听器,Wildfly 确实仍然失败了。我只是想指出,在这种特殊情况下,@EJB
注入可以解决问题。
【参考方案1】:
正如@Franck 所指出的,这是一个错误,最终在去年仅在版本 11 (wildfly) 中得到修复(在 EAP 7.1 中也是如此)。我们使用 EAP 7.0 (wildfly 10) 和相同的问题,我们无法升级。作为解决方法,我们现在使用 @Tiny 的建议,将我们的功能移动到 EJB 并使用 @EJB
iso @Inject
。
感谢该主题的所有用户,只是想将其合并到一个答案中以供以后参考。
【讨论】:
以上是关于org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: 参数resolvedBean 不能为空的主要内容,如果未能解决你的问题,请参考以下文章