@Interceptors is definitely where the problem is occurring. This warning 
message...

WARN [LogStreamAsync.Thread] (Log4jLogStream.java:59) - Injection data not
found in JNDI context: jndiName='comp/env/com.goxpro.
xpro.business.domain.base.BaseService/context', target=com.goxpro.xpro.
business.domain.base.BaseService/context

…is coming from org.apache.openejb.InjectionProcessor . In debug I see that it 
successfully finds this jodi name:

“comp/env/com.goxpro.xpro.business.domain.base.BaseService/em"

…but not this jodi name…

“comp/env/com.goxpro.xpro.business.domain.base.BaseService/context"

Here’s BaseService:

public abstract class BaseService {

        private final String demoModeStr = System.getProperty(“demo");

        @PersistenceContext(unitName = "xpro")
        protected EntityManager em;

        @Resource
        protected SessionContext context;
…
}

The warning comes from InjectionProcessor.fillInjectionProperties(final 
ObjectRecipe objectRecipe) 
which is down the stack from StatelessInstanceManager.create(final 
ThreadContext callContext, final BeanContext beanContext) 
where callContext is SecurityManagerService, which is a subclass of BaseService.

@Stateless
@Local(ISecurityManagerServiceLocal.class)
@Remote(ISecurityManagerServiceRemote.class)
@Interceptors({ UsernameCacheRefresher.class })
public class SecurityManagerService extends BaseService
                implements ISecurityManagerServiceLocal, 
ISecurityManagerServiceRemote {

So, is @Resource no longer the right way to inject SessionContext?

> On 24 May 2017, at 9:43 PM, Romain Manni-Bucau <[email protected]> wrote:
> 
> Le 24 mai 2017 15:39, "JumpStart" <[email protected]> a
> écrit :
> 
> Some good news. I’ve commented out the @Interceptors line in each session
> bean and now they can be called just fine! I’ll dig a bit deeper into why
> the interceptor is failing.
> 
> Producing a sample is going to be hard. If I do, will you require it to be
> a working maven project (please no)? What’s the minimum you’re looking for?
> 
> 
> Command line buildable (= dont assume we can use the same IDE with the same
> config as you). Maven/gradle/ant/Makefile are ok.
> 
> 
>> On 24 May 2017, at 8:08 PM, Romain Manni-Bucau <[email protected]>
> wrote:
>> 
>> Le 24 mai 2017 14:05, "JumpStart" <[email protected]> a
>> écrit :
>> 
>> The deployment is a collapsed EAR.
>> 
>> If it’s a scanning issue, it wasn’t one before the upgrade.
>> 
>> I’ve not needed @Interceptor before. The javadoc says it’s not needed
> “This
>> annotation is optional if the Interceptors <http://docs.oracle.com/
>> javaee/6/api/javax/interceptor/Interceptors.html> annotation ... used to
>> associate the interceptor with the target class.” (http://docs.oracle.com/
>> javaee/6/api/javax/interceptor/Interceptor.html <http://docs.oracle.com/
>> javaee/6/api/javax/interceptor/Interceptor.html>). I’ve just tried it
>> anyway and the result is the same.
>> 
>> Surely the key to this problem has to be in the following message?
>> 
>> WARN [LogStreamAsync.Thread] (Log4jLogStream.java:59) - Injection data not
>> found in JNDI context: jndiName='comp/env/com.goxpro.
>> xpro.business.domain.base.BaseService/context', target=com.goxpro.xpro.
>> business.domain.base.BaseService/context
>> 
>> 
>> 
>> Well this message is a consequence so yes but it doesnt help much :(. C1n
>> you push a sample on github using 7.x or 4.7 reproducing the issue?
>> 
>> 
>>> On 24 May 2017, at 6:57 PM, Romain Manni-Bucau <[email protected]>
>> wrote:
>>> 
>>> How is the deployment/packaging? Can it be a scanning issue? You dont add
>>> @Interceptor on the interceptor?
>>> 
>>> 
>>> Le 24 mai 2017 11:28, "JumpStart" <[email protected]> a
>>> écrit :
>>> 
>>>> I’m upgrading from 4.5.2 to 7.0.3. Since the upgrade, I have an
>>>> interceptor that fails and consequently session beans can’t be invoked.
> I
>>>> found the same error when I tried to upgrade to 4.6.0.2. Was there a
> JNDI
>>>> change between 4.5.2 and 4.6.0.2?
>>>> 
>>>> 
>>>> WARN [LogStreamAsync.Thread] (Log4jLogStream.java:59) - Injection data
>>>> not found in JNDI context: jndiName='comp/env/com.goxpro.
>>>> xpro.business.domain.base.BaseService/context', target=com.goxpro.xpro.
>>>> business.domain.base.BaseService/context
>>>> WARN [LogStreamAsync.Thread] (Log4jLogStream.java:59) - Injection data
>>>> not found in JNDI context: jndiName='comp/env/com.goxpro.
>>>> xpro.business.domain.base.UsernameCacheRefresher/context',
>>>> target=com.goxpro.xpro.business.domain.base.
>> UsernameCacheRefresher/context
>>>> WARN [LogStreamAsync.Thread] (Log4jLogStream.java:59) - Injection data
>>>> not found in JNDI context: jndiName='comp/env/com.goxpro.
>>>> xpro.business.domain.base.UsernameCacheRefresher/context',
>>>> target=com.goxpro.xpro.business.domain.base.
>> UsernameCacheRefresher/context
>>>> WARN [LogStreamAsync.Thread] (Log4jLogStream.java:59) - Injection data
>>>> not found in JNDI context: jndiName='comp/env/com.goxpro.
>>>> xpro.business.domain.base.UsernameCacheRefresher/context',
>>>> target=com.goxpro.xpro.business.domain.base.
>> UsernameCacheRefresher/context
>>>> ERROR [LogStreamAsync.Thread] (Log4jLogStream.java:51) -
>>>> EjbTransactionUtil.handleSystemException: null
>>>> java.lang.NullPointerException
>>>>      at com.goxpro.xpro.business.domain.base.UsernameCacheRefresher.
>>>> refreshUsernameCache(UsernameCacheRefresher.java:38)
>>>>      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>      at sun.reflect.NativeMethodAccessorImpl.invoke(
>>>> NativeMethodAccessorImpl.java:62)
>>>>      at sun.reflect.DelegatingMethodAccessorImpl.invoke(
>>>> DelegatingMethodAccessorImpl.java:43)
>>>>      at java.lang.reflect.Method.invoke(Method.java:497)
>>>>      at org.apache.openejb.core.interceptor.
>>>> ReflectionInvocationContext$Invocation.invoke(
>> ReflectionInvocationContext.
>>>> java:205)
>>>>      at org.apache.openejb.core.interceptor.
>>>> ReflectionInvocationContext.proceed(ReflectionInvocationContext.
> java:186)
>>>>      at org.apache.openejb.monitoring.StatsInterceptor.record(
>>>> StatsInterceptor.java:181)
>>>>      at org.apache.openejb.monitoring.StatsInterceptor.invoke(
>>>> StatsInterceptor.java:100)
>>>>      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>      at sun.reflect.NativeMethodAccessorImpl.invoke(
>>>> NativeMethodAccessorImpl.java:62)
>>>>      at sun.reflect.DelegatingMethodAccessorImpl.invoke(
>>>> DelegatingMethodAccessorImpl.java:43)
>>>>      at java.lang.reflect.Method.invoke(Method.java:497)
>>>>      at org.apache.openejb.core.interceptor.
>>>> ReflectionInvocationContext$Invocation.invoke(
>> ReflectionInvocationContext.
>>>> java:205)
>>>>      at org.apache.openejb.core.interceptor.
>>>> ReflectionInvocationContext.proceed(ReflectionInvocationContext.
> java:186)
>>>>      at org.apache.openejb.core.interceptor.InterceptorStack.
>>>> invoke(InterceptorStack.java:85)
>>>>      at org.apache.openejb.core.stateless.StatelessContainer._
>>>> invoke(StatelessContainer.java:252)
>>>>      at org.apache.openejb.core.stateless.StatelessContainer.
>>>> invoke(StatelessContainer.java:212)
>>>>      at org.apache.openejb.core.ivm.EjbObjectProxyHandler.
>>>> synchronizedBusinessMethod(EjbObjectProxyHandler.java:265)
>>>>      at org.apache.openejb.core.ivm.EjbObjectProxyHandler.
>>>> businessMethod(EjbObjectProxyHandler.java:260)
>>>>      at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(
>>>> EjbObjectProxyHandler.java:89)
>>>>      at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(
>>>> BaseEjbProxyHandler.java:347)
>>>>      at com.sun.proxy.$Proxy206.passivateEligibleClients(Unknown
>>>> Source)
>>>>      at com.goxpro.xpro.web.daemons.InactiveClientsManagerTask.doNext(
>>>> InactiveClientsManagerTask.java:65)
>>>>      at com.goxpro.xpro.web.daemons.AbstractTaskRunner.run(
>>>> AbstractTaskRunner.java:124)
>>>>      at java.util.TimerThread.mainLoop(Timer.java:555)
>>>>      at java.util.TimerThread.run(Timer.java:505)
>>>> 
>>>> 
>>>> The NPE line is indicated in this source...
>>>> 
>>>> 
>>>> public class UsernameCacheRefresher {
>>>> 
>>>>      @Resource
>>>>      private javax.ejb.SessionContext context;
>>>> 
>>>>      private static final Logger logger = LoggerFactory.getLogger(
>>>> BaseService.class);
>>>> 
>>>>      @AroundInvoke
>>>>      public Object refreshUsernameCache(InvocationContext ic) throws
>>>> Exception {
>>>> 
>>>>              Principal callerPrincipal = context.getCallerPrincipal();
>>>> <<< Line 38. NPE happens here.
>>>> 
>>>>              if (callerPrincipal != null) {
>>>>                      UsernameCache.setThreadUsername(
>>>> callerPrincipal.getName());
>>>>              }
>>>>              else {
>>>>                      // Is this even possible? Isn't there a default
>>>> principal of guest (OpenEJB) or anonymous (JBoss)?
>>>>                      logger.error("WATCH OUT - UsernameCacheRefresher
>>>> found callerPrincipal is null!!!!!!!!!!!!!");
>>>>                      UsernameCache.setThreadUsername(null);
>>>>              }
>>>> 
>>>>              return ic.proceed();
>>>>      }
>>>> 
>>>> }
>>>> 
>>>> 
>>>> Here’s an example of how it gets used…
>>>> 
>>>> 
>>>> @Stateless
>>>> @Local(IEmailManagerServiceLocal.class)
>>>> @Remote(IEmailManagerServiceRemote.class)
>>>> @Interceptors({ UsernameCacheRefresher.class })
>>>> public class EmailManagerService extends BaseService implements
>>>> IEmailManagerServiceLocal, IEmailManagerServiceRemote {
>>>> …
>>>> }
>>>> 
>>>> 
>>>> Thanks in advance,
>>>> 
>>>> Geoff

Reply via email to