views:

3239

answers:

3

Hi,

I am following the MasteringEJB4thEdition book, which I downloaded from The Server Site website.

There is a simple example of HelloBean, which works perfectly with GlassFish V3 app server. The same example when deployed on JBOSS fails because of JNDI name lookup.

Is there any rule how the JNDI lookup names in JBOSS are decided if we don't provide any ? I found while googling that it is "ear-file-name/Bean-class-name/remote" but it doesn't work for me.

Here is the bean


   1. package com.hardik.stateless;  
   2. import javax.ejb.Stateless;  
   3. import javax.ejb.Remote  
   4.   
   5.   
   6.   
   7.   
   8. @Stateless  
   9. @Remote(Hello.class)  
  10. public class HelloBean implements Hello {  
  11.   
  12.     public String hello() {  
  13.         System.out.println("hello()");  
  14.         return "Hello, World!";  
  15.     }  
  16.   
  17. }  

Here is the client I am using:


   1. package com.hardik.stateless;  
   2.   
   3. import javax.naming.Context;  
   4. import javax.naming.InitialContext;  
   5.   
   6.   
   7. /** 
   8.  * This is an example of client code which invokes  
   9.  * methods on a simple, remote stateless session bean 
  10.  * @author hardik 
  11.  * 
  12.  */  
  13. public class HelloClient {  
  14.       
  15.     public static void main(String[] args) throws Exception {  
  16.           
  17.         Context ctx = new InitialContext();  
  18.         // works for Glassfish  
  19.         //Hello hello = (Hello) ctx.lookup("com.hardik.stateless.Hello");  
  20.         // doesn't  work for JBOSS  
  21.         Hello hello = (Hello) ctx.lookup("hello-bean/HelloBean/remote");  
  22.           
  23.         System.out.println(hello.hello());  
  24.     }  
  25.   
  26. }  

Here is the error I get while executing the client


# $ wsrunclient.sh -Djava.naming.factory.initial=org.jnp.interfaces.NamingContextFactory -Djava.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces -Djava.naming.provider.url=jnp://localhost:1099  -cp "lib/hello-bean.jar:dist/hello-client.jar:/home/hardik/apps/jboss/client/*"  com.hardik.stateless.HelloClient  
# log4j:WARN No appenders could be found for logger (org.jnp.interfaces.TimedSocketFactory).  
# log4j:WARN Please initialize the log4j system properly.  
# Exception in thread "main" javax.naming.NameNotFoundException: hello-bean not bound  
#         at org.jnp.server.NamingServer.getBinding(NamingServer.java:771)  
#         at org.jnp.server.NamingServer.getBinding(NamingServer.java:779)  
#         at org.jnp.server.NamingServer.getObject(NamingServer.java:785)  
#         at org.jnp.server.NamingServer.lookup(NamingServer.java:396)  
#         at sun.reflect.GeneratedMethodAccessor260.invoke(Unknown Source)  
#         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:886)  
#         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)  
#         at java.lang.Thread.run(Thread.java:619)  
#         at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)  
#         at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)  
#         at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)  
#         at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)  
#         at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)  
#         at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:682)  
#         at javax.naming.InitialContext.lookup(InitialContext.java:392)  
#         at com.hardik.stateless.HelloClient.main(Unknown Source)
A: 

I'm not sure about JBoss 5, but under JBoss 4, the JMX console has an MBean called JNDIView, which has operations to dump the entire JNDI tree to the console. If that's still there in JBoss 5, you should be able to find your EJB on there.

skaffman
A: 

I checked the jndi view with jmx console, the bean is registered only internally, not in the Global JNDI. I see following message at the time of deployment...


12:15:44,016 INFO  [JBossASKernel] Added bean(jboss.j2ee:ear=hello-bean.ear,jar=hello-bean.jar,name=HelloBean,service=EJB3) to KernelDeployment of: hello-bean.jar
12:15:44,048 INFO  [SessionSpecContainer] Starting jboss.j2ee:ear=hello-bean.ear,jar=hello-bean.jar,name=HelloBean,service=EJB3
12:15:44,048 INFO  [EJBContainer] STARTED EJB: com.hardik.mejb.HelloBean ejbName: HelloBean
12:15:44,048 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:


12:15:44,078 WARN  [WebServiceDeployerEJB] Ingore ejb deployment with null classname: org.jboss.metadata.ejb.jboss.JBossSessionBeanMetaData@bebe0782{HelloBean}

rangalo
+1  A: 

I fixed the problem after searching. I had to add namespace information to my ejb-jar.xml file.

I changed it from:

<ejb-jar> 
    <enterprise-beans>
    </enterprise-beans> 
</ejb-jar>

to:

   1. <?xml version="1.0" encoding="UTF-8"?>  
   2. <ejb-jar version="3.0"   
   3.     xmlns="http://java.sun.com/xml/ns/javaee"  
   4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
   5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
   6.     http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"&gt;  
   7. </ejb-jar>

I found the answer here: http://www.jboss.org/index.html?module=bb&amp;op=viewtopic&amp;t=157022

rangalo