Stateless bean injection fails during application server startup

Thomas Butz <[email protected]> Mon, 21 Jul 2025 10:23:03 +0200
Newsgroups gmane.comp.java.openejb.user
Message-ID <b8a33f3d-43a8-4825-a9de-e312f72245dc__37280.1114151784$1753086200$gmane$org@optitool.de>
Hi, I'm currently struggling with a potential bug in TomEE 10.1.0. The=20
problem seems to be triggered by the early injection of a stateless EJB=20
during server startup.
This results in a cascade of NPEs for subsequent stateless EJB injections=
.

This is the first exception that can be observed during the startup phase=
:

java.lang.NullPointerException: Cannot invoke=20
"org.apache.openejb.core.stateless.StatelessInstanceManager$Data.poolPop(=
)"=20
because "data" is null
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.stateless.StatelessInstanceManager.getInstance(St=
atelessInstanceManager.java:218)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessCont=
ainer.java:204)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMet=
hod(EjbObjectProxyHandler.java:265)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjec=
tProxyHandler.java:260)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyH=
andler.java:89)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandle=
r.java:349)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at jdk.proxy17/jdk.proxy17.$Proxy272.doMasterDataExpo=
rt(Unknown=20
Source) ~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
de.optitool.bean.export.AsyncExportBean.handleMessage(AsyncExportBean.jav=
a:176)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
de.optitool.bean.export.AsyncExportBean.onMessage(AsyncExportBean.java:92=
)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMe=
thodHandleAccessor.java:103)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at java.base/java.lang.reflect.Method.invoke(Method.j=
ava:580) ~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocatio=
n.invoke(ReflectionInvocationContext.java:210)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(R=
eflectionInvocationContext.java:191)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.ja=
va:191)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.ja=
va:101)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMe=
thodHandleAccessor.java:103)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at java.base/java.lang.reflect.Method.invoke(Method.j=
ava:580) ~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocatio=
n.invoke(ReflectionInvocationContext.java:210)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(R=
eflectionInvocationContext.java:191)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorSt=
ack.java:95)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.mdb.MdbContainer._invoke(MdbContainer.java:536)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.mdb.MdbContainer.invoke(MdbContainer.java:510)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.mdb.AbstractEndpointHandler.deliverMessage(Abstra=
ctEndpointHandler.java:115)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.mdb.EndpointHandler.deliverMessage(EndpointHandle=
r.java:28)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.mdb.AbstractEndpointHandler.invoke(AbstractEndpoi=
ntHandler.java:81)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.openejb.core.mdb.EndpointHandler.invoke(EndpointHandler.java:2=
8)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
de.optitool.bean.export.AsyncExportBean$$LocalBeanProxy.onMessage(de/opti=
tool/bean/export/AsyncExportBean.java)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessag=
e(MessageEndpointProxy.java:123)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProx=
y.java:64)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:1056) ~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:170)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:3=
65)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.j=
ava:32)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExe=
cutor.java:1144)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at=20
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolEx=
ecutor.java:642)=20
~[?:?]
 =C2=A0=C2=A0=C2=A0 at java.base/java.lang.Thread.run(Thread.java:1583) [=
?:?]


The AsyncExportBean is a message-driven bean which tries to invoke the=20
"doMasterDataExport()" of a local stateless EJB injected with @EJB.

I quickly skimmed through the StatelessInstanceManager code, and it=20
doesn't seem to expect BeanContext.getContainerData() to return a null=20
value.