You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by "Alban THOMAS (JIRA)" <ji...@apache.org> on 2017/10/04 07:31:00 UTC

[jira] [Created] (TOMEE-2130) Tomcat + OpenEJB embedded in JEE6 webapp : Injection data not found in JNDI context

Alban THOMAS created TOMEE-2130:
-----------------------------------

             Summary: Tomcat + OpenEJB embedded in JEE6 webapp : Injection data not found in JNDI context
                 Key: TOMEE-2130
                 URL: https://issues.apache.org/jira/browse/TOMEE-2130
             Project: TomEE
          Issue Type: Bug
    Affects Versions: 1.7.4
         Environment: OpenEJB 4.7.4
Tomcat 8.5.20
            Reporter: Alban THOMAS
            Priority: Minor
         Attachments: Alban2.war, Alban.war

I am building a java webapp with EJB 3.0 into Tomcat (not TomEE).
OpenEJB is "manually" initialized at server startup.

{code:java}
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
p.setProperty("openejb.jndiname.format", "app/{ejbName}!{interfaceClass}");
p.setProperty("openejb.deploymentId.format", "{ejbClass}");
p.setProperty("openejb.deployments.classpath.ear", "false");
p.setProperty("openejb.validation.skip", "true");
InitialContext ic = new InitialContext(p);
{code}

My stateless beans have a {{javax.ejb.SessionContext}} variable with {{javax.annotation.Resource}} annotation :

{code:java}
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@Local(AlbanBeanI.class)
public class AlbanBean {

	@Resource
	private SessionContext albanSessionCtx;

	public void printContext() {
		System.out.println("AlbanBean::printContext() = " + albanSessionCtx);
	}
}
{code}

Lookup on the bean JNDI name works fine, but it seems that the {{SessionContext}} variable is {{null}} because injection data is not found.

Running this code :
{code:java}
try {
	Object bean = ic.lookup("app/AlbanBean!xALTH.AlbanBeanI");
	System.out.println("lookup app/AlbanBean!xALTH.AlbanBeanI returned " + bean);
	Method m = bean.getClass().getMethod("printContext");
	System.out.println("Method = " + m);
	m.invoke(bean);
	
}
catch(Exception e) {
	e.printStackTrace();
}
{code}

Gives following output :
{panel}
lookup app/AlbanBean!xALTH.AlbanBeanI returned proxy=xALTH.AlbanBeanI;deployment=xALTH.AlbanBean;pk=null
Method = public final void com.sun.proxy.$Proxy36.printContext()
{color:red}04-Oct-2017 08:40:17.410 AVERTISSEMENT localhost-startStop-1 org.apache.openejb.InjectionProcessor.fillInjectionProperties Injection data not found in JNDI context: jndiName='comp/env/xALTH.AlbanBean/albanSessionCtx', target=xALTH.AlbanBean/albanSessionCtx{color}
AlbanBean::printContext() = null
{panel}

This can be reproduced by deploying attached [^Alban.war] into Tomcat (codes run at Tomcat startup).

After intensive debug into OpenEJB and Catalina classes , it seems to me that the {{InjectionProcessor}} tries to resolve a {{org.apache.openejb.core.ivm.naming.JndiUrlReference}} for this injection, whose JNDI name is {{java:comp/EJBContext}}.
Unfortunately, lookup on this name on a {{new InitialContext()}} throws a {{NameNotFoundException}}.

I noticed that I did not had the same issue within TomEE, the difference beeing that {{java:comp/EJBContext}} on a {{new InitialContext}} is found.
Going deeper into the lookup, I found that {{org.apache.naming.ContextBindings::isThreadBound()}} return true in that context, while it returns false into my Tomcat test case.
This leads to do the lookups on different BoundContext instances, respectively {{org.apache.tomee.catalina.OpenEJBContext}} versus {{org.apache.naming.NamingContext}}

I figured out that the difference is linked to {{org.apache.tomee.cataligna.TomcatLoader::initialize()}}, which is adding a TomEE specific listener on {{org.apache.openejb.core.ThreadContext}}
If execute this code line after initializing OpenEJB, the issue is somehow "solved" :

{code:java}
ThreadContext.addThreadContextListener(new TomcatThreadContextListener());
{code}

This can be reproduced by deploying attached [^Alban2.war]
{{albanSessionCtx}} instance is now correctly valorized by injection (no Injection data warning by the way)
{panel}
lookup app/AlbanBean!xALTH.AlbanBeanI returned proxy=xALTH.AlbanBeanI;deployment=xALTH.AlbanBean;pk=null
Method = public final void com.sun.proxy.$Proxy36.printContext()
AlbanBean::printContext() = org.apache.openejb.core.stateless.StatelessContext@35bff8af
{panel}

I dont think that injection should need that in order to work. It leads me to add some tomee-catalina.jar into my dependencies, which I dont want. So I certainly am willing to admit that I do miss something.
Any suggestions/ideas appreciated.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)