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 不能为空的主要内容,如果未能解决你的问题,请参考以下文章

WELD-001456参数bean不能为空

GlassFish - IllegalStateException

EJB 的 CDI 生产者