Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-2387

CDI injection in entity listeners failing

    Details

      Description

      When trying to use CDI injection in JPA entity listeners, deployment fails with the following exception:

      16:16:37,448 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 15) MSC000001: Failed to start service jboss.persistenceunit."inject-ear.ear#primary": org.jboss.msc.service.StartException in service jboss.persistenceunit."inject-ear.ear#primary": java.lang.IllegalStateException: JBAS016071: Singleton not set for org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader@4eeb95dc. This means that you are trying to access a weld deployment with a Thread Context ClassLoader that is not associated with the deployment.
      	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:169)
      	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117)
      	at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.7.0_25]
      	at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:463) [wildfly-security-manager-1.0.0.Beta3.jar:1.0.0.Beta3]
      	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:178)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_25]
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_25]
      	at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25]
      	at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.1.Final.jar:2.1.1.Final]
      Caused by: java.lang.IllegalStateException: JBAS016071: Singleton not set for org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader@4eeb95dc. This means that you are trying to access a weld deployment with a Thread Context ClassLoader that is not associated with the deployment.
      	at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:75)
      	at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:128)
      	at org.jboss.weld.Container.instance(Container.java:65)
      	at org.jboss.weld.manager.BeanManagerImpl.getBeans(BeanManagerImpl.java:563)
      	at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:90)
      	at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:358)
      	at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:369)
      	at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:72)
      	at org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:60)
      	at org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66)
      	at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
      	at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64)
      	at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90)
      	at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory$BeanMetaData.<init>(BeanManagerListenerFactory.java:82)
      	at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory$BeanMetaData.<init>(BeanManagerListenerFactory.java:71)
      	at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory.buildListener(BeanManagerListenerFactory.java:57)
      	at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.resolveCallbacks(LegacyCallbackProcessor.java:168)
      	at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.processCallbacksForEntity(LegacyCallbackProcessor.java:71)
      	at org.hibernate.jpa.event.spi.JpaIntegrator.integrate(JpaIntegrator.java:150)
      	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
      	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1837)
      	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:854)
      	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:847)
      	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:396)
      	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:846)
      	at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
      	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:151)
      	... 8 more
      

      I've created a small showcase of the problem: https://github.com/papegaaij/listener-injection

        Gliffy Diagrams

          Issue Links

            Activity

            Hide
            dfranssen Dirk Franssen added a comment -

            Just for info: injection in an entity listener on Glassfish 4.1 doesn't work either. (@Inject seems to be ignored and the field stays null, resulting in nullpointer exceptions)

            Currently I also use the BeanManager workaround on Wildfly 8.1.0.Final. This BeanManager can be injected though, so no need for a jndi lookup.

            MyEntityListener.java

            ...
            @Inject
            BeanManager beanManager; //Workaround WFLY-2387
            ...
             
            protected String getPrincipalName() {
                    //Workaround WFLY-2387
                    Set beans = beanManager.getBeans(Principal.class);
                    Bean bean = (Bean) beans.iterator().next();
                    CreationalContext ctx = beanManager.createCreationalContext(bean);
                    Principal principal =  (Principal) beanManager.getReference(bean, Principal.class, ctx);
                    
                    return principal.getName();
            }
            

            Show
            dfranssen Dirk Franssen added a comment - Just for info: injection in an entity listener on Glassfish 4.1 doesn't work either. (@Inject seems to be ignored and the field stays null, resulting in nullpointer exceptions) Currently I also use the BeanManager workaround on Wildfly 8.1.0.Final. This BeanManager can be injected though, so no need for a jndi lookup. MyEntityListener.java ... @Inject BeanManager beanManager; //Workaround WFLY-2387 ...   protected String getPrincipalName() { //Workaround WFLY-2387 Set beans = beanManager.getBeans(Principal.class); Bean bean = (Bean) beans.iterator().next(); CreationalContext ctx = beanManager.createCreationalContext(bean); Principal principal = (Principal) beanManager.getReference(bean, Principal.class, ctx); return principal.getName(); }
            Hide
            smarlow Scott Marlow added a comment -

            Is the best test case still at https://issues.jboss.org/browse/WFLY-2387?focusedCommentId=12826416&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-12826416? How does that fail? If there is an updated failure (other than "Singleton not set for org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader@5bedfb57.") could you please attach it.

            The current attachment reflects an already fixed "Singleton not set for " error.

            Show
            smarlow Scott Marlow added a comment - Is the best test case still at https://issues.jboss.org/browse/WFLY-2387?focusedCommentId=12826416&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-12826416 ? How does that fail? If there is an updated failure (other than "Singleton not set for org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader@5bedfb57.") could you please attach it. The current attachment reflects an already fixed "Singleton not set for " error.
            Hide
            tremes Tomas Remes added a comment -

            Hey Scott,
            I've just tried the test on today's master (wildfly-9.0.0.Alpha2-SNAPSHOT) and I am getting following exception:

            service jboss.persistenceunit."test.war#mypc": org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument resolvedBean must not be null
            	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: 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:797)
            	at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
            	at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:371)
            	at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:382)
            	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:82)
            	at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory$BeanMetaData.<init>(BeanManagerListenerFactory.java:71)
            	at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory.buildListener(BeanManagerListenerFactory.java:57)
            	at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.resolveCallbacks(LegacyCallbackProcessor.java:167)
            	at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.processCallbacksForEntity(LegacyCallbackProcessor.java:70)
            	at org.hibernate.jpa.event.spi.JpaIntegrator.integrate(JpaIntegrator.java:150)
            	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:312)
            	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)
            	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
            	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)
            	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
            	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
            	at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
            	at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154)
            	... 7 more
            

            Show
            tremes Tomas Remes added a comment - Hey Scott, I've just tried the test on today's master (wildfly-9.0.0.Alpha2-SNAPSHOT) and I am getting following exception: service jboss.persistenceunit."test.war#mypc": org.jboss.weld.exceptions.IllegalArgumentException: WELD-001456: Argument resolvedBean must not be null 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: 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:797) at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92) at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:371) at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:382) 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:82) at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory$BeanMetaData.<init>(BeanManagerListenerFactory.java:71) at org.hibernate.jpa.event.internal.jpa.BeanManagerListenerFactory.buildListener(BeanManagerListenerFactory.java:57) at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.resolveCallbacks(LegacyCallbackProcessor.java:167) at org.hibernate.jpa.event.internal.jpa.LegacyCallbackProcessor.processCallbacksForEntity(LegacyCallbackProcessor.java:70) at org.hibernate.jpa.event.spi.JpaIntegrator.integrate(JpaIntegrator.java:150) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:312) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) at org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154) ... 7 more
            Hide
            smarlow Scott Marlow added a comment -

            Thanks Tomas Remes for recreating. Did you have to modify https://github.com/bafco/wildfly/commits/entitylistener? If yes, could you push your branch to github.

            I noticed that https://java.net/jira/browse/JPA_SPEC-83 has zero votes. From the description:

            I suggest that we make it a requirement that entity listeners are not registered until the entity class is first used by the application (post application deployment time).

            Also, the more important jira is https://hibernate.atlassian.net/browse/HHH-8706, which is about changing Hibernate 5.0 to delay registering the entity listener until after deployment is complete (if that is possible to do without impacting performance).

            Show
            smarlow Scott Marlow added a comment - Thanks Tomas Remes for recreating. Did you have to modify https://github.com/bafco/wildfly/commits/entitylistener? If yes, could you push your branch to github. I noticed that https://java.net/jira/browse/JPA_SPEC-83 has zero votes. From the description: I suggest that we make it a requirement that entity listeners are not registered until the entity class is first used by the application (post application deployment time). Also, the more important jira is https://hibernate.atlassian.net/browse/HHH-8706 , which is about changing Hibernate 5.0 to delay registering the entity listener until after deployment is complete (if that is possible to do without impacting performance).
            Hide
            tremes Tomas Remes added a comment -

            Yes but it's basically Matus's test applied to actual master. Nothing more. Here it is https://github.com/tremes/wildfly/tree/WFLY-2387-test

            Show
            tremes Tomas Remes added a comment - Yes but it's basically Matus's test applied to actual master. Nothing more. Here it is https://github.com/tremes/wildfly/tree/WFLY-2387-test

              People

              • Assignee:
                smarlow Scott Marlow
                Reporter:
                papegaaij Emond Papegaaij
              • Votes:
                17 Vote for this issue
                Watchers:
                27 Start watching this issue

                Dates

                • Created:
                  Updated:

                  Development