title: JNDI lookup fails when connecting from Tomcat to an EJB in JBoss 7.1.1
body: <p>There are several ways to lookup an EJB</p>
  
  <p>I can connect to my ejb server by using this lookup, but only when I use a ConsoleClient.</p>
  
  <pre><code> "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName)
  </code></pre>
  
  <p>When I try this lookup on a tomcat application server (spring mvc project), this lookup won't work. Jboss responds with a ClassNotFoundException.</p>
  
  <p>I assume there has to be another jndi lookup name? Unfortunately I couldn't find any helpful information on the web.</p>
  
  <p>Edit:</p>
  
  <p>my controller </p>
  
  <pre><code>@RequestMapping(value = "login", method = RequestMethod.POST)
  public LoginBeanRemote logIn(){
  
      final Hashtable jndiProperties = new Hashtable();
      jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
  
      Context context = null;
      try {
          context = new InitialContext(jndiProperties);
      } catch (NamingException e1) {
          // TODO Auto-generated catch block
          e1.printStackTrace();
      }
  
  
      final String appName = "foo_business";
      final String moduleName = "foo_business";
      final String distinctName = "";
      final String beanName = "LoginBean";
  
      // gesucht ist die klasse vom jboss , nicht die im frontend
      final String viewClassName = "foo.business.login.LoginBeanRemote";
      System.out.println("Looking EJB via JNDI ");
      System.out.println("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
  
      try {
          return (LoginBeanRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
      } catch (NamingException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      return null;
  
  
  }
  </code></pre>
  
  <p>I put a jboss-ejb-client.properties file in my spring projects root folder</p>
  
  <blockquote>
    <p>endpoint.name=foo_business //project name<br>
    remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false<br>
    remote.connections=default<br>
    remote.connection.default.host=127.0.0.1<br>
    remote.connection.default.port=4447<br>
    remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false</p>
  </blockquote>
  
  <p>first part of my LoginBean (which is deployed as a JAR file in my JBOSS;</p>
  
  <pre><code>@Stateful
  @Remote(LoginBeanRemote.class)
  public class LoginBean implements LoginBeanRemote {
  </code></pre>
  
  <p>Generated EJB lookup name:</p>
  
  <pre><code>ejb:foo_business/foo_business//LoginBean!foo.business.login.LoginBeanRemote
  </code></pre>
  
  <p>Error:</p>
  
  <pre><code>javax.naming.NamingException: Could not load ejb proxy class recc.business.login.LoginBeanRemote [Root exception is java.lang.ClassNotFoundException: recc.business.login.LoginBeanRemote]
  at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:108)
  at org.jboss.ejb.client.naming.ejb.EjbNamingContext.lookup(EjbNamingContext.java:96)
  at javax.naming.InitialContext.lookup(Unknown Source)
  at recc.frontend.controller.UserController.logIn(UserController.java:161)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  at java.lang.reflect.Method.invoke(Unknown Source)
  at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
  at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
  at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  at java.lang.Thread.run(Unknown Source)
  Caused by: java.lang.ClassNotFoundException: recc.business.login.LoginBeanRemote
      at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
      at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
      at java.lang.Class.forName0(Native Method)
      at java.lang.Class.forName(Unknown Source)
      at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:106)
      ... 36 foo
  </code></pre>
  
  <p>EDIT:</p>
  
  <p>I added the ejb-project.jar to my classpath.
  Also I added the ejb package to my spring project and I put the <code>LoginBeanRemote</code> there.</p>
  
  <p>So far the Project does not respond with an ClassNotFound error.
  When I debug the created LoginBeanRemote it contails:</p>
  
  <pre><code>Proxy for remote EJB StatelessEJBLocator{appName='foo_business', moduleName='foo_business', distinctName='', beanName='LoginBean', view='interface foo.business.login.LoginBeanRemote'}
  </code></pre>
  
  <p>There is no exception during lookup.</p>
  
  <pre><code>    LoginBeanRemote remote = (LoginBeanRemote) context.lookup("ejb:"
                  + appName + "/" + moduleName + "/" + distinctName + "/"
                  + beanName + "!" + viewClassName);
          return remote;
  </code></pre>
  
  <p>When I try to call a function of the bean, it will cause an exception </p>
  
  <pre><code>System.out.println(remote.helloBean());
  </code></pre>
  
  <p>Full Message:</p>
  
  <pre><code>   Aug 30, 2013 11:26:21 AM org.apache.catalina.core.StandardWrapperValve invoke
  SEVERE: Servlet.service() for servlet [appServlet] in context with path [/test] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No EJB receiver available for handling [appName:foo_business,modulename:foo_business,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@c7c0866] with root cause
  java.lang.IllegalStateException: No EJB receiver available for handling [appName:foo_business,modulename:foo_business,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@c7c0866
      at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
      at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
      at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
      at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
      at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
      at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
      at com.sun.proxy.$Proxy10.helloBean(Unknown Source)
      at foo.frontend.controller.UserController.logIn(UserController.java:167)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
      at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
      at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
      at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source)
  </code></pre>
  
  <p>EDIT: I just shut down the JBoss and the same error appeared. 
  I don't think there is any connection with the Jboss, at all. </p>
  
  <p>Edit:</p>
  
  <p>I just updated my code:</p>
  
  <pre><code>    InitialContext context = null;
      try {
          final Properties initialContextProperties = new Properties();
  
          initialContextProperties.put(Context.INITIAL_CONTEXT_FACTORY,
                  "org.jboss.naming.remote.client.InitialContextFactory");
  
          initialContextProperties.put(Context.PROVIDER_URL,
                  "remote://localhost:4447");
  
          initialContextProperties.put(Context.URL_PKG_PREFIXES,
                  "org.jboss.ejb.client.naming");
  
          initialContextProperties
                  .put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT",
                          "false");
  
          initialContextProperties.put(Context.SECURITY_PRINCIPAL, "myapplicationrealmuser");
          initialContextProperties
                  .put(Context.SECURITY_CREDENTIALS, "mypass");
  
          EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(
                  initialContextProperties);
          ContextSelector&lt;EJBClientContext&gt; selector = new ConfigBasedEJBClientContextSelector(
                  cc);
          EJBClientContext.setSelector(selector);
  
          context = new InitialContext(initialContextProperties);
      } catch (NamingException e1) {
          // TODO Auto-generated catch block
          e1.printStackTrace();
      }
  
  
      System.out.println("Looking EJB via JNDI ");
  
      try {
  
          LoginBeanRemote remote = (LoginBeanRemote) context
                  .lookup("java:global/foo_business/LoginBean!foo.business.login.LoginBeanRemote");
          System.out.println(remote.helloBean());
      } catch (NamingException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      return null;
  </code></pre>
  
  <p>This will return an NameNotFoundException during lookup. I've tried all kinds of lookup names but it won't work like this. Am I missing some configuration?</p>
  
  <p>error:</p>
  
  <pre><code>javax.naming.NameNotFoundException: global/foo_business/LoginBean!foo.business.login.LoginBeanRemote -- service jboss.naming.context.java.jboss.exported.global.foo_business."LoginBean!foo.business.login.LoginBeanRemote"
      at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
      at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
      at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
      at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source)
  </code></pre>
  
  <p>JBOSS Console JNDI Informations:</p>
  
  <p><img src="https://i.stack.imgur.com/VSSPG.jpg" alt="enter image description here"></p>
  
  <p>Edit:</p>
  
  <p>I deployed the EJB as a EAR file, still receiving the same exception</p>
  
  <pre><code>javax.naming.NameNotFoundException: global/foo_business_ear-ear/foo_business_ear-ejb/LoginBean!foo.business.login.LoginBeanRemote -- service jboss.naming.context.java.jboss.exported.global.foo_business_ear-ear.foo_business_ear-ejb."LoginBean!foo.business.login.LoginBeanRemote"
      at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
      at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
      at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
      at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source)
  
  ERROR: org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1 - Channel end notification received, closing channel Channel ID ef1b671f (outbound) of Remoting connection 6af39445 to localhost/127.0.0.1:4447
  </code></pre>