views:

3949

answers:

2

When I try the following lookup in my code:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource) envCtx.lookup("jdbc/mydb");

I get the following exception:

java.sql.SQLException: QueryResults: Unable to initialize naming context: 
    Name java:comp is not bound in this Context at 
    com.onsitemanager.database.ThreadLocalConnection.getConnection
    (ThreadLocalConnection.java:130) at     
    ...

I installed embedded JBoss following the JBoss wiki instructions. And I configured Tomcat using the "Scanning every WAR by default" deployment as specified in the configuration wiki page.

Quoting the config page:

JNDI

Embedded JBoss components like connection pooling, EJB, JPA, and transactions make extensive use of JNDI to publish services. Embedded JBoss overrides Tomcat's JNDI implementation by layering itself on top of Tomcat's JNDI instantiation. There are a few > reasons for this:

  1. To avoid having to declare each and every one of these services within server.xml
  2. To allow seemeless integration of the java:comp namespace between web apps and EJBs.
  3. Tomcat's JNDI implementation has a few critical bugs in it that hamper some JBoss components ability to work
  4. We want to provide the option for you of remoting EJBs and other services that can > be remotely looked up

Anyone have any thoughts on how I can configure the JBoss naming service which according to the above quote is overriding Tomcat's JNDI implementation so that I can do a lookup on java:comp/env?

FYI - My environment Tomcat 5.5.9, Seam 2.0.2sp, Embedded JBoss (Beta 3),

Note: I do have a -ds.xml file for my database connection properly setup and accessible on the class path per the instructions.

Also note: I have posted this question in embedded Jboss forum and seam user forum.

+1  A: 

java:comp/env is known as the Enterprise Naming Context (ENC) and is not globally visible. See here for more information. You will need to locate the global JNDI name which your datasource is regsitered at.

The easiest way to do this is to navigate to JBoss' web-based JMX console and look for a 'JNDIView' (not exactly sure of the name - currently at home) mbean. This mbean should have a list method which you can invoke, which will display the context path for all of the JNDI-bound objects.

toolkit
+1  A: 

Thanks for the response toolkit.... yes, I can access my datasource by going directly to java:jdbc/mydb, but I'm using an existing code base that connects via the ENC. Here's some interesting info that I've found out ....

  1. The above code works with JBoss 4.2.2.GA and here's the JNDI ctx parameters being used:
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces: org.jboss.naming:org.jnp.interfaces

  2. The above code works with Tomcat 5.5.x and here's the JNDI ctx parameters being used:
    java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory java.naming.factory.url.pkgs=org.apache.naming

  3. The above code fails with Embedded JBoss (Beta 3) in Tomcat 5.5.x with the above error message.
    java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory java.naming.factory.url.pkgs=org.apache.namingThe above code fails with the above error using JBoss Embedded in tomcat 5.5.x

Anyone have any thoughts I what I need to do with configuring embedded JBoss JNDI configuration?

Joe Dean
Did you find a solution? I am also having this problem. Application works fine with native tomcat, datasources work as expected, but when JBoss is embedded I get a "Name java:comp is not bound in this Context" error.
waquin