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

WFLYEJB0132: @PostConstruct method of EJB singleton recursively invoked

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • Major
    • None
    • 21.0.1.Final
    • CDI / Weld, EE, EJB
    • None
    • Undefined
    • ---
    • ---

    Description

      I have following two classes:

       

      The Parent class is a "javax.ejb.Singleton" and injects the other Singleton Child:

      import javax.annotation.PostConstruct;
      import javax.inject.Inject;
      @javax.ejb.Singleton
      @javax.ejb.Startup
      public class Parent {
       
       @Inject 
       private Child child;
       
       @PostConstruct
       private void postConstruct() {
       System.out.println("> Parent (" + getId() + ") created.");
       child.sendMessage();
       }
       
       public Integer getId() {
       return this.hashCode();
       }
      }
      

       

      The Child class is a "javax.inject.Singleton" and injects the other Singleton Parent:

      import javax.annotation.PostConstruct;
      import javax.inject.Inject;
      @javax.inject.Singleton
      //@javax.ejb.Singleton
      public class Child {
       
       private Parent parent;
       
       // no-args constructor not needed for @javax.inject.Singleton
       public Child() {
       }
       
       // the parent should be injected if already created by container
       @Inject
       public Child(Parent parent) {
       this.parent = parent;
       }
       
       @PostConstruct
       private void postConstruct() {
       System.out.println("> Child (" + getId() + ") created.");
       }
       
       public void sendMessage() {
       System.out.println("> Child called to parent: " + parent.getId());
       }
       
       public Integer getId() {
       return this.hashCode();
       }
      }
      

       

      As both are Singletons, the "postConstruct()" for those two classes should only be called once. The Child uses a constructor with an injected Parent thus it should look for it if this instance is already created. However, it seems that the container tries to create the Parent-Instance twice, hence the following error:

      Caused by: java.lang.IllegalStateException: WFLYEJB0132: @PostConstruct method of EJB singleton Parent of type io.Parent has been recursively invoked
       at org.jboss.as.ejb3@21.0.0.Final//org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:124)
       at org.jboss.as.ejb3@21.0.0.Final//org.jboss.as.ejb3.component.singleton.SingletonComponentInstanceAssociationInterceptor.processInvocation(SingletonComponentInstanceAssociationInterceptor.java:48)
       at org.jboss.invocation@1.6.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
       at org.jboss.as.ejb3@21.0.0.Final//org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54)
       at org.jboss.invocation@1.6.0.Final//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
       at org.jboss.as.ejb3@21.0.0.Final//org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:199)
       ... 101 more

      Of course, I can use "@Inject Parent parent" within the Singleton "Child" instead of constructor injection, then no error is shown. However, constructor injection should also work, or? Is this a bug or is this intended? 

       

      Attachments

        Activity

          People

            manovotn Matěj Novotný
            nimo22 nimo stephan (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: