Saturday, October 06, 2007

Why do i get NameNotFoundException while doing a JNDI lookup?

Many a times when you are doing a lookup in the JNDI tree, you see javax.naming.NameNotFoundException. A simple code that does the lookup will look something like:


Context ctx = new InitialContext();
Object obj = ctx.lookup("somepath/somename");


This code just looks up the JNDI tree to get an object bound by the name "somepath/somename". Looks simple. However, chances are that you might even see this exception:


javax.naming.NameNotFoundException: somepath not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(InitialContext.java:351)


Look closely at the stacktrace. It shows that while looking up the JNDI tree it could not find the jndi name "somepath" (this name may vary). The reason is simple, the JNDI tree does not have any object bound by this name.

To quote the javadocs of this exception "This exception is thrown when a component of the name cannot be resolved because it is not bound."

So how do i know, what's the name to which my object is bound? Each application server, usually provides a JNDI view which can be used to see the contents of the JNDI tree. If you know what object you are looking for (ex: the name of the bean), then you can traverse this JNDI tree to see what name it is bound to. The JNDI view is specific to every application server.

To give an example, JBoss provides its JDNI tree view, through the JMX console. Here are the steps, one has to follow to check the JNDI tree contents on JBoss:

- Go to http://< server>:< port>/jmx-console (Ex: http://localhost:8080/jmx-console)
- Search for service=JNDIView on the jmx-console page
- Click on that link
- On the page that comes up click on the Invoke button beside the list() method
- The page that comes up will show the contents of the JNDI tree.

Here's an sample of how the output looks like(just a small part of the entire output):


java: Namespace

+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
+- SecurityProxyFactory (class: org.jboss.security.SubjectSecurityProxyFactory)
+- DefaultJMSProvider (class: org.jboss.jms.jndi.JNDIProviderAdapter)
+- comp (class: javax.naming.Context)
+- JmsXA (class: org.jboss.resource.adapter.jms.JmsConnectionFactoryImpl)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- jaas (class: javax.naming.Context)
| +- dukesbank (class: org.jboss.security.plugins.SecurityDomainContext)
| +- HsqlDbRealm (class: org.jboss.security.plugins.SecurityDomainContext)
| +- jbossmq (class: org.jboss.security.plugins.SecurityDomainContext)
| +- JmsXARealm (class: org.jboss.security.plugins.SecurityDomainContext)


Global JNDI Namespace

+- ebankTxController (proxy: $Proxy79 implements interface com.sun.ebank.ejb.tx.TxControllerHome,interface javax.ejb.Handle)
+- ebankAccountController (proxy: $Proxy75 implements interface com.sun.ebank.ejb.account.AccountControllerHome,interface javax.ejb.Handle)
+- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- jmx (class: org.jnp.interfaces.NamingContext)
| +- invoker (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor (proxy: $Proxy48 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
| +- rmi (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
+- HTTPXAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- ebankCustomer (proxy: $Proxy67 implements interface com.sun.ebank.ejb.customer.LocalCustomerHome)
+- UserTransactionSessionFactory (proxy: $Proxy14 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
+- ebankCustomerController (proxy: $Proxy77 implements interface com.sun.ebank.ejb.customer.CustomerControllerHome,interface javax.ejb.Handle)
+- HTTPConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- TransactionSynchronizationRegistry (class: com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple)
+- ebankAccount (proxy: $Proxy68 implements interface com.sun.ebank.ejb.account.LocalAccountHome)
+- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
+- UILXAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- UIL2XAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- queue (class: org.jnp.interfaces.NamingContext)
| +- A (class: org.jboss.mq.SpyQueue)
| +- testQueue (class: org.jboss.mq.SpyQueue)
| +- ex (class: org.jboss.mq.SpyQueue)
| +- DLQ (class: org.jboss.mq.SpyQueue)
| +- D (class: org.jboss.mq.SpyQueue)
| +- C (class: org.jboss.mq.SpyQueue)
| +- B (class: org.jboss.mq.SpyQueue)


Let's see what this tells us. Let's consider the Global JNDI Namespace first. It contains (among other things) the following:

+- ebankTxController (proxy: $Proxy79 implements interface com.sun.ebank.ejb.tx.TxControllerHome,interface javax.ejb.Handle)


This tells me that an object which implements com.sun.ebank.ejb.tx.TxControllerHome and javax.ejb.Handle interfaces is bound to the JNDI tree by the jndi-name "ebankTxController". So if at all i have to lookup this object, my lookup code would be something like:


Context ctx = new InitialContext();
ctx.lookup("ebankTxController");


Similarly in the same Global JDNI Namespace, we see :


+- queue (class: org.jnp.interfaces.NamingContext)
| +- A (class: org.jboss.mq.SpyQueue)



Make note of the nesting of the names here. This tells me that an object of type org.jboss.mq.SpyQueue is bound by the name "A under the path queue". So your lookup for this object should look like:


Context ctx = new InitialContext();
ctx.lookup("queue/A");


Now let's move on to the java: namespace in the JNDI tree view above. The difference between a Global JNDI namespace and the java: namespace is that, the object bound in the java: namespace can be looked-up ONLY by clients within the SAME JVM. Whereas, in case of Global JNDI namespace, the objects bound in this namespace can be looked-up by clients, even if they are not in the same JVM as the server. One would ask, how does this matter? Consider a standalone java program(client) which tries to lookup some object on the server (running in its own JVM). Whenever a standalone client is started (using the java command), a new JVM is instantiated. As a result, the server (which is started in its own JVM) and the client are running on different JVMs. Effectively, the client will NOT be able to lookup objects bound in the java: namespace of the server. However, the client can lookup the objects present in the Global JNDI namespace of the server.

So, why are we discussing these details, in a topic which was meant to explain the NameNotFoundException? Let's consider the java: namespace output above. There's a


+- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)


This tells me that there's an object bound to the name DefaultDS in the java: namespace. So my lookup code would be:


Context ctx = new InitialContext();
ctx.lookup("java:/DefaultDS");


As explained above, this code is going to return you the object, if this piece of code runs in the same JVM as the server. However, if this piece of code is run from a client in different JVM (maybe a standalone client), then it's going to run into NameNotFoundException. The reason i explained the java: and the Global JNDI namespace is that, sometimes people are surprised that even though the JNDI view shows that the object is bound in the java: namespace(with the same name as the one they pass to the lookup method), they still run into NameNotFoundException. The probable reason might be, the client is in a different JVM.

37 comments:

  1. myself Nag from B'lore . Nice to see you the article .
    I want to know some information . Even
    +- SimpleSessionBean (class: org.jnp.interfaces.NamingContext)
    | +- remote (proxy: $Proxy74 implements interface beans.SimpleSession,interface org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)

    is available in Global Name Space but i am not to access from the client by using constructs "SimpleSessionBean/remote" ... please tell me how can i access it.
    Thanks in advance

    ReplyDelete
  2. Nag,

    Post the exception stacktrace that you see and also the code which you use for the JNDI lookup. Is your client a standalone Java class?

    ReplyDelete
  3. yeah here is the client code


    //SimpleSessionClient.java
    package client;

    import beans.SimpleSession;
    import javax.naming.InitialContext;

    public class SimpleSessionClient {
    public static void main(String[] args) throws Exception
    {
    InitialContext ctx = new InitialContext();
    SimpleSession simpleSession
    = (SimpleSession) ctx.lookup(SimpleSession.class.getName());
    for (int i = 0; i < args.length; i++) {
    String returnedString = simpleSession.getEchoString(args[i]);
    System.out.println("sent string: " + args[i] +", received string: " + returnedString);
    }
    }
    }

    and the trace is
    Exception in thread "main" javax.naming.NameNotFoundException: beans.SimpleSession not bound

    ReplyDelete
  4. and also plz let me know the links abt good tutorials , books about EJB

    ReplyDelete
  5. ctx.lookup(SimpleSession.class.getName());

    The lookup string is incorrect. If your JNDI view shows that the bean is bound to:

    +- SimpleSessionBean (class: org.jnp.interfaces.NamingContext)
    | +- remote (proxy: $Proxy74 implements interface beans.SimpleSession,interface org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)

    then you should lookup with that exact same string. Change your lookup code to:

    ctx.lookup("SimpleSessionBean/remote");

    ReplyDelete
  6. yesss ,,,, i know it is working with when I changed it to:

    SimpleSession simpleSession = (SimpleSession) ctx.lookup("SimpleSessionBean/remote");


    But ,

    What is the correct naming convention to use for this? Why was the tutorial referring to the interface, while for it to work I had to change it to the actual implementation?

    ReplyDelete
  7. this is another issue....

    client code is

    package com.webage.client;

    import java.util.Properties;

    import javax.naming.*;
    import com.webage.ejbs.SimpleBean;

    public class TestClient {

    public void runTest() throws Exception {
    Properties props = new Properties();
    props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
    props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
    props.setProperty("java.naming.provider.url", "localhost");

    InitialContext ctx = new InitialContext(props);
    SimpleBean bean = (SimpleBean) ctx.lookup("firstebj3/SimpleBeanImpl/remote");
    String result = bean.sayHello("Billy Bob");
    System.out.println(result);
    }

    public static void main(String[] args) {
    try {
    TestClient cli = new TestClient();
    cli.runTest();

    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    JNDI View is

    +- firstejb3 (class: org.jnp.interfaces.NamingContext)
    | +- SimpleBeanImpl (class: org.jnp.interfaces.NamingContext)
    | | +- remote (proxy: $Proxy79 implements interface com.webage.ejbs.SimpleBean,interface org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)


    Stack trace is

    javax.naming.NameNotFoundException: firstebj3 not bound
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
    at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
    at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:589)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at com.webage.client.TestClient.runTest(TestClient.java:17)
    at com.webage.client.TestClient.main(TestClient.java:25)

    ReplyDelete
  8. bestalltimes said:

    ctx.lookup("firstebj3/SimpleBeanImpl/remote");


    You have a typo in that lookup string. firstebj3 should be changed to firstejb3

    bestalltimes said:

    What is the correct naming convention to use for this? Why was the tutorial referring to the interface, while for it to work I had to change it to the actual implementation?



    *By default*, that's what the JNDI name is. You can specify any JNDI name you want to use either using annotations or through jboss.xml.

    ReplyDelete
  9. Thanks ... especially for Typo mistake :-)

    ReplyDelete
  10. If u dont mind , please send me the links that describe the EJB to the point
    Thanks in advance

    ReplyDelete
  11. bestalltimes said:

    If u dont mind , please send me the links that describe the EJB to the point


    When i started off with EJB (2.x) i used "Mastering EJB". At present the new version of EJB3 has a lot of improvements for which you might want to refer "Mastering EJB3". I personally havent read that book yet.

    I always hang out at www.javaranch.com site. This site has a section for various book reviews. Here's the url for the EJB book review section: http://www.javaranch.com/bunkhouse/JavaBeans.jsp
    This might help you in deciding which one to go for.

    ReplyDelete
  12. This comment has been removed by a blog administrator.

    ReplyDelete
  13. Hi Jai,
    what you have written over here is pretty simple and I just got the hang of things in a couple of minutes.

    I had this helloworld app and deployed this in glassfish and jBoss. I did not know that we need to use a different lookup format for locating beans for different App Servers.

    But now I am able to say " hello " in any app server.

    Thanks!

    ReplyDelete
  14. Hello,

    What's the difference between 'not bound' and 'JNDI implementation returned null'

    Thanks

    ReplyDelete
  15. Anonymous said

    What's the difference between 'not bound' and 'JNDI implementation returned null'

    Sorry, i can't recollect seeing such an error, before.

    ReplyDelete
  16. Great!

    Got mine working on jboss!

    Your post did it!

    Youre heaven sent Jaikiran!

    -Jesus Angeles/ fellow javarancher

    ReplyDelete
  17. Jesus Angeles wrote

    Great!

    Got mine working on jboss!

    Your post did it!


    Glad to know that, this post helped :)

    ReplyDelete
  18. Hi,I was facing this same exception while doing a JNDI lookup when working on Jboss 4.2.0 eap and JBoss-messaging 1.4.0 GA.
    I'm confused about what do I feed as a parameter to the following:
    QueueConnectionFactory = (QueueConnectionFactory) ictx.lookup("...");

    I went as per your this post of yours and got the following while invoking the list:

    java: Namespace

    +- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
    +- SecurityProxyFactory (class: org.jboss.security.SubjectSecurityProxyFactory)
    +- DefaultJMSProvider (class: org.jboss.jms.jndi.JNDIProviderAdapter)
    +- atgpub_ds (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
    +- comp (class: javax.naming.Context)
    +- JmsXA (class: org.jboss.resource.adapter.jms.JmsConnectionFactoryImpl)
    +- jaas (class: javax.naming.Context)
    | +- messaging (class: org.jboss.security.plugins.SecurityDomainContext)
    | +- jmx-console (class: org.jboss.security.plugins.SecurityDomainContext)
    | +- JmsXARealm (class: org.jboss.security.plugins.SecurityDomainContext)
    +- comp.original (class: javax.namingMain.Context)
    +- timedCacheFactory (class: javax.naming.Context)
    Failed to lookup: timedCacheFactory, errmsg=org.jboss.util.TimedCachePolicy
    +- TransactionPropagationContextExporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
    +- StdJMSPool (class: org.jboss.jms.asf.StdServerSessionPoolFactory)
    +- Mail (class: javax.mail.Session)
    +- comp.ejb3 (class: javax.naming.Context)
    | NonContext: null
    +- TransactionPropagationContextImporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
    +- atgcore_ds (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
    +- TransactionManager (class: com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate)


    Global JNDI Namespace

    +- TransactionSynchronizationRegistry (class: com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple)
    +- UserTransactionSessionFactory (proxy: $Proxy14 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
    +- UUIDKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.uuid.UUIDKeyGeneratorFactory)
    +- console (class: org.jnp.interfaces.NamingContext)
    | +- PluginManager (proxy: $Proxy50 implements interface org.jboss.console.manager.PluginManagerMBean)
    +- topic (class: org.jnp.interfaces.NamingContext)
    +- queue (class: org.jnp.interfaces.NamingContext)
    +- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
    +- local (class: org.jnp.interfaces.NamingContext)
    | +- ClasspathSession@3425314 (proxy: $Proxy58 implements interface atg.dafdeploy.ClasspathSessionLocalHome)
    +- jmx (class: org.jnp.interfaces.NamingContext)
    | +- invoker (class: org.jnp.interfaces.NamingContext)
    | | +- RMIAdaptor (proxy: $Proxy49 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
    | +- rmi (class: org.jnp.interfaces.NamingContext)
    | | +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
    +- HiLoKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory)

    Thanks in advance.

    ReplyDelete
  19. Arham,

    Are you sure, you have installed and deployed the JBoss Messaging related artifacts correctly? The jndi contents that you posted does not contain anything related to the JMS. I would have expected a jndi-name "ConnectionFactory" to be present in the global JNDI namespace. You could then have used this in the lookup string.

    QueueConnectionFactory qf = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");

    ReplyDelete
  20. Hi,I did try for using "ConnectionFactory" as a parameter in the lookup method tht U've suggested..but still teh same exception...Could you tell me as to how can I register my ConnectionFactory under Global namespace. I guess it's something to do with jms-ds.xml...but still cant figure out how to...:'(
    Thanx in advance

    ReplyDelete
  21. Hi,I've verified that my installations are proper according to the document of jboss-messaging,could you redirect me to some links or pointers that could help me figure out what am I missing. :(

    ReplyDelete
  22. I am also facing the same issue as Arham. I have deployed Connection Factory and Topic which are visible in jboss.messaging.connectionfactory and jboss.messaging.destination, however the JNDI name are not visible in JNDI view.

    I am using JBoss EAP 4.3 and JBoss Messaging 1.4.0_SP3

    As such I am experiencing NameNotFoundException.

    Thanks for the help..

    ReplyDelete
  23. gauravkbansal wrote

    I am also facing the same issue as Arham...


    Gaurav, could you please start a topic in the JBoss JNDI forum with more details about your setup and the exception you are seeing

    ReplyDelete
  24. I am also having similar issue. Any help will be highly appreciated

    Here is my scenario:
    I have EJB deployed on the localhost and port 1099 on JBoss (3.2.x) server on one application

    Here is JNDI looks like from 1099 server…

    Global JNDI Namespace
    +- com (class: org.jnp.interfaces.NamingContext)
    | +- retek (class: org.jnp.interfaces.NamingContext)
    | | +- rsm (class: org.jnp.interfaces.NamingContext)
    | | | +- external (class: org.jnp.interfaces.NamingContext)
    | | | | +- service (class: org.jnp.interfaces.NamingContext)
    | | | | | +- SecurityDisplayableReferenceService (proxy: $Proxy194 implements interface com.retek.rsm.external.service.SecurityDisplayableReferenceServiceRemoteHome,interface javax.ejb.Handle)
    | | | | | +- SecurityDisplayableReferenceServiceLocal (proxy: $Proxy108 implements interface com.retek.rsm.external.service.SecurityDisplayableReferenceServiceLocalHome)


    On the same box I have another application which calls above EJB using the JNDI, This application runs on separate JBoss server on port 1089.

    Here is the code..

    System.out.println("Locating jndi properties...");

    try {
    String rpmJndiName = "com/retek/rsm/external/service/SecurityDisplayableReferenceService";
    ResourceBundle bundle = ResourceBundle.getBundle("jndi");

    provider = “localhost:1099”;
    factory = “org.jnp.interfaces.NamingContextFactory”;

    if (null == provider || null == factory) { throw new RuntimeException(
    "Unable to locate the provider url or factory in the jndi.properties file."); }
    } catch (Exception e) {
    throw new RuntimeException("Unable to load the jndi.properties file", e);
    }

    System.out.println("Validating jndi set up on server " + provider + " \n\twith " + factory
    + " factory...");

    try {
    InitialContext rpmAdminContext = getInitialContext(rpmJndiName);
    rpmDisplayableReferenceServiceRaw = rpmAdminContext.lookup(rpmJndiName);
    rpmAdminContext.close();

    Getting following error:

    java.lang.RuntimeException: javax.naming.NameNotFoundException: external not bound
    Unable to locate jndiName on the jndi server. Check the jndi registry to ensure that the security service is appropriately set.
    at com.retek.rsm.TestRemoteConnectionRPM.main(TestRemoteConnectionRPM.java:65)
    Caused by: javax.naming.NameNotFoundException: external not bound
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:490)
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:498)
    at org.jnp.server.NamingServer.getObject(NamingServer.java:504)
    ….
    ….

    Please help!!

    ReplyDelete
  25. Hi Jai,

    Your blogs are really good.
    I have 1 question.As of my perception says..When we have client and app. server in the same maching it implies that we are running under the same JVM.When I read your this blog it says

    Whereas, in case of Global JNDI namespace, the objects bound in this namespace can be looked-up by clients, even if they are not in the same JVM as the server. One would ask, how does this matter? Consider a standalone java program(client) which tries to lookup some object on the server (running in its own JVM). Whenever a standalone client is started (using the java command), a new JVM is instantiated. As a result, the server (which is started in its own JVM) and the client are running on different JVMs. Effectively, the client will NOT be able to lookup objects bound in the java: namespace of the server. However, the client can lookup the objects present in the Global JNDI namespace of the server.

    It made be in confusion.Can you explain me bit more in this.

    Thanks once again.

    Rahul B.

    ReplyDelete
  26. Just want to say Thanks so much for your posting - it explained a lot. The Global Namespace stuff is not entirely clear for newbies. It would be helpful to have an example on the JBoss page to that effect. I have spent hours on this!

    ReplyDelete
  27. Hello Jai, excellent post by the way. I've got the following situation. I've injected (via guice) an ejb3 ref in a struts2 action. This is what I get in my global jndi view:
    +- ep (class: org.jnp.interfaces.NamingContext)
    | +- com.xyz.services.UserServiceBean (class: org.jnp.interfaces.NamingContext)
    | | +- remote (proxy: $Proxy105 implements interface com.xyz.services.UserService,interface org.jboss.ejb3.JBossProxy)
    | +- UserServiceBean (class: org.jnp.interfaces.NamingContext)

    According to your post, I should reference the object via "ep/com.xyz.services.UserServiceBean/remote", right? Well, I keep getting this when I try to access this object and cast it to its interface (UserServiceBean implements UserService):

    java.lang.ClassCastException
    java.lang.Class.cast(Class.java:2990)
    com.google.inject.jndi.JndiIntegration$JndiProvider.get(JndiIntegration.java:59)
    com.google.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    com.google.inject.InjectorImpl$SingleFieldInjector.inject(InjectorImpl.java:473)


    Any thoughts?

    Thanks a lot!

    ReplyDelete
  28. Corindiano,


    You are using the correct lookup string. The ClassCastException either means an incorrect code or some classloading issue. Could you please create a forum thread here so that we can discuss this in detail? Please provide the entire exception stacktrace and other details there while posting. Thanks.

    ReplyDelete
  29. Hi Jai Kiran,
    This was a nice article. Thanks for posting it.
    Here is my issue. I am configuring and using jndi names in spring. My issue is as follows.
    We have different datasources already configured in jboss and being used for years. Now I need to configure same datasources in a different application (spring based) so the same code that looks up jndi names in jboss should also work in spring app. I do not have the flexibility of changing datasource jndi names.
    Current jndi lookup code is as follows:
    Context jndiContext = new InitialContext();
    datasource = (DataSource) jndiContext.lookup("java:/aDSName");

    This above code works when called with in jboss but not in spring app.
    I used xbean-spring-common api to configure datasource jndi with jndiname = "java:/aDSName" as described here: http://servicemix.apache.org/jndi-configuration.html

    But the above code does NOT work when called from spring app. Gives following exception. Since your article doesn't cover spring based jndi lookup, I thought of asking you, in case you can help me.
    javax.naming.NameNotFoundException: aDSName
    at org.apache.xbean.spring.jndi.DefaultContext.lookup(DefaultContext.java:147)
    at javax.naming.InitialContext.lookup(InitialContext.java:351)

    ReplyDelete
  30. I m Sandeep

    Neatly explained. Thanks for such a good explanation.

    ReplyDelete
  31. hi,

    I am new to jboss & i am pretty stucked with the naming exception here is my stack trace
    -----------------------------------

    sorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.ha.framework.interfaces.HARMIClient.invoke(HARMIClient.java
    :187)
    at $Proxy161.lookup(Unknown Source)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at org.jboss.resource.adapter.jms.JmsManagedConnection.setup(JmsManagedC
    onnection.java:682)
    ... 52 more
    11:04:37,788 INFO [STDOUT] javax.jms.JMSException: Could not create a session:
    javax.resource.spi.CommException: javax.naming.NameNotFoundException: XAConnecti
    onFactory
    11:04:37,788 INFO [STDOUT] at org.jboss.resource.adapter.jms.JmsSessionFact
    oryImpl.allocateConnection(JmsSessionFactoryImpl.java:392)
    11:04:37,788 INFO [STDOUT] at org.jboss.resource.adapter.jms.JmsSessionFact
    oryImpl.createQueueSession(JmsSessionFactoryImpl.java:133)
    11:04:37,788 INFO [STDOUT] at Bean.JMSRABean.sendTxnToInputTrxnQueue(JMSRAB
    ean.java:114)
    11:04:37,788 INFO [STDOUT] at sun.reflect.GeneratedMethodAccessor85.invoke(
    Unknown Source)
    11:04:37,788 INFO [STDOUT] at sun.reflect.DelegatingMethodAccessorImpl.invo
    ke(DelegatingMethodAccessorImpl.java:25)
    11:04:37,788 INFO [STDOUT] at java.lang.reflect.Method.invoke(Method.java:5
    97)
    11:04:37,788 INFO [STDOUT] at org.jboss.invocation.Invocation.performCall(I
    nvocation.java:345)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.StatelessSessionContainer$Conta
    inerInterceptor.invoke(StatelessSessionContainer.java:214)
    11:04:37,788 INFO [STDOUT] at org.jboss.resource.connectionmanager.CachedCo
    nnectionInterceptor.invoke(CachedConnectionInterceptor.java:185)
    11:04:37,788 INFO [STDOUT] at org.jboss.webservice.server.ServiceEndpointIn
    terceptor.invoke(ServiceEndpointInterceptor.java:51)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.CallValidationIntercept
    or.invoke(CallValidationInterceptor.java:48)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.AbstractTxInterceptor.i
    nvokeNext(AbstractTxInterceptor.java:105)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.AbstractTxInterceptorBM
    T.invokeNext(AbstractTxInterceptorBMT.java:153)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.TxInterceptorBMT.invoke
    (TxInterceptorBMT.java:62)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.StatelessSessionInstanc
    eInterceptor.invoke(StatelessSessionInstanceInterceptor.java:130)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.SecurityInterceptor.inv
    oke(SecurityInterceptor.java:139)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.LogInterceptor.invoke(L
    ogInterceptor.java:192)
    11:04:37,788 INFO [STDOUT] at org.jboss.ejb.plugins.ProxyFactoryFinderInter
    ceptor.invoke(ProxyFactoryFinderInterceptor.java:122)

    -----------------
    I am not able to find the queue name in the global jndi namespace & jboss version is 4.0.2

    ReplyDelete
  32. hi m new to jboss. m getting the error cannot lookup datasource with JNDI Name : jdbc-ds-SEC .I am not able to view the jndi name in the jndi tree.what i should do.

    ReplyDelete
  33. thanks JaiKiran by the help of this post i have successfully created my ejb hello word application.

    ReplyDelete
  34. "Now let's move on to the java: namespace in the JNDI tree view above. The difference between a Global JNDI namespace and the java: namespace is that, the object bound in the java: namespace can be looked-up ONLY by clients within the SAME JVM."

    Bless you, my friend. I have wasted 1 day with this!

    ReplyDelete
  35. Hi Jai,

    Im trying to lookup an application/Bean name.While taking the jmx-console im not able to see the application in the jndi tree.My application is say x.ear and im trying to access a bean in x.ear from another module packed in y.war.Both of them are running on the same jboss.Pls help

    ReplyDelete
  36. Please create a forum thread here http://www.coderanch.com/forums/f-63/JBoss and provide all the relevant details like the JBoss/WildFly version you are using and the code snippets. Also post there, how you are deploying the application

    ReplyDelete