-
Bug
-
Resolution: Unresolved
-
Major
-
None
-
21.0.1.Final
-
CDI / Weld, EE, EJB
-
None
-
Undefined
-
---
-
---
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?