org.jboss.weld.exceptions.IllegalArgumentException:WELD-001456:参数resolvedBean不得为空

Tin*_*iny 5 hibernate cdi entitylisteners wildfly jakarta-ee

从 JPA 2.1 开始,可以将 EJB 注入实体侦听器。然而,WildFly 9.0.2 最终版失败,并出现以下异常。

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"}}
Run Code Online (Sandbox Code Playgroud)

提出这个问题只是因为我在某处读到自 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() {

    }
}
Run Code Online (Sandbox Code Playgroud)

EJB 完全空白:

@Stateless
public class TestBean implements TestService {

}
Run Code Online (Sandbox Code Playgroud)

TestService如果删除注入点 ( ),异常就会消失。

@ApplicationScoped用或指定侦听器@Singleton也没有帮助(这在现实中是不需要的)。

Hibernate 版本是 5.0.5 Final,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:

根据问题状态,这个问题已在 Hibernate 5.1.0 Final 中得到修复,并且应该在 WildFly 10.0.0 Final 中相应地工作,但它仍然无法工作,并出现同样的异常 - 没有任何改进。

ond*_*ijn 2

正如 @Franck 所指出的,这是一个错误,并最终在去年仅在版本 11 (wildfly) 中得到修复(EAP 7.1 中也是如此)。我们使用 EAP 7.0 (wildfly 10) 和同样的问题,我们无法升级。作为解决方法,我们现在使用 @Tiny 的建议,将我们的功能移至 EJB 并使用@EJBiso @Inject

感谢该主题的所有用户,只是想将其合并到答案中以供以后参考。