geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Neal Sanche <n...@nsdev.org>
Subject Local Session Bean lookups and JNDI
Date Fri, 17 Jun 2005 03:24:13 GMT
Hi All,

Well, I'm working through the details for a Struts web app with an EJB 
back end, all being compiled with a Maven build script and just putting 
all of the pieces in place to have XDoclet 1.2.3 do much of the major 
gruntwork for the Struts-config.xml and the ejb-jar.xml and web.xml 
also. Lots of details, but most of them are coming together now.

But I'm stuck on the JNDI side of things, it seems. I've discovered the 
need for specifying the jndi-name and local-jndi-name for my CMP 2 EJB, 
and my Stateless Session Bean inside of openejb-jar.xml and I've 
confirmed that my changes are having an effect on the deployed 
application by looking at the Debug Console and clicking on my EJBs. I 
have also put entries in my web.xml to link them like I used to do with 
another container I've used before. But I think maybe there's more to it 
in Geronimo? I can't do Local JNDI lookups and instantiate my EJBs like 
I used to be able to?

Do I need something in the geronimo-jetty.xml deployment plan file? What 
I have in my web.xml looks like this:

   <ejb-local-ref >
      <ejb-ref-name>ejb/PhoneBookEntryLocal</ejb-ref-name>
      <ejb-ref-type>Entity</ejb-ref-type>
      
<local-home>org.acme.phonebook.ejb.PhoneBookEntryLocalHome</local-home>
      <local>org.acme.phonebook.ejb.PhoneBookEntryLocal</local>
      <ejb-link>PhoneBookEntry</ejb-link>
   </ejb-local-ref>
   <ejb-local-ref >
      <ejb-ref-name>ejb/PhoneBookSessionLocal</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      
<local-home>org.acme.phonebook.ejb.PhoneBookSessionLocalHome</local-home>
      <local>org.acme.phonebook.ejb.PhoneBookSessionLocal</local>
      <ejb-link>PhoneBookSession</ejb-link>
   </ejb-local-ref>

My Debug Console looks something like the following:

JndiNames 	[PhoneBookEntry]
LocalJndiNames 	[org.acme.phonebook.ejb/PhoneBookEntryLocalHome]


and

JndiNames 	[org.acme.phonebook.ejb/PhoneBookSession/Home]
LocalJndiNames 	[org.acme.phonebook.ejb/PhoneBookSession/LocalHome]


for each of them. Yes, I know, I make strange names for my JNDI 
entries... but that's what XDoclet seems to do for me, and as long as I 
can get it working, I don't care what it looks like. But, when I try the 
following code, Geronimo does this:

    public Collection getEntries() {
        try {
            InitialContext ctx = new InitialContext();
            PhoneBookSessionLocal session = 
PhoneBookSessionUtil.getLocalHome().create();
            Collection c = session.listEntries();
            return c;
        } catch (Throwable ex) {
            System.err.println(ex);
            ex.printStackTrace();
        }
       
        return new ArrayList();
    }


javax.naming.NameNotFoundException: org.acme.phonebook.ejb
javax.naming.NameNotFoundException: org.acme.phonebook.ejb
        at 
com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java
:95)
        at 
com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java
:103)
        at javax.naming.InitialContext.lookup(InitialContext.java:351)
        at 
org.acme.phonebook.ejb.PhoneBookSessionUtil.lookupHome(PhoneBookSessi
onUtil.java:16)
        at 
org.acme.phonebook.ejb.PhoneBookSessionUtil.getLocalHome(PhoneBookSes
sionUtil.java:54)
        at org.acme.phonebook.struts.PhoneList.getEntries(PhoneList.java:51)

XDoclet is generating the following method, which I've used for years 
without incident:

   public static org.acme.phonebook.ejb.PhoneBookSessionLocalHome 
getLocalHome() throws javax.naming.NamingException
   {
      return (org.acme.phonebook.ejb.PhoneBookSessionLocalHome) 
lookupHome(null, 
org.acme.phonebook.ejb.PhoneBookSessionLocalHome.JNDI_NAME, 
org.acme.phonebook.ejb.PhoneBookSessionLocalHome.class);
   }

   private static Object lookupHome(java.util.Hashtable environment, 
String jndiName, Class narrowTo) throws javax.naming.NamingException {
      // Obtain initial context
      javax.naming.InitialContext initialContext = new 
javax.naming.InitialContext(environment);
      try {
         Object objRef = initialContext.lookup(jndiName);
         // only narrow if necessary
         if (java.rmi.Remote.class.isAssignableFrom(narrowTo))
            return javax.rmi.PortableRemoteObject.narrow(objRef, narrowTo);
         else
            return objRef;
      } finally {
         initialContext.close();
      }
   }

and the constants that it's using are:

   public static final String 
COMP_NAME="java:comp/env/ejb/PhoneBookSessionLocal";
   public static final String 
JNDI_NAME="org.acme.phonebook.ejb/PhoneBookSession/LocalHome";


I guess I'm feeling a little blind these days, since working with 
another container I was always able to simply take a squint at the JNDI 
tree through a nice little JMX method. Is there a similar operation I 
can do with this Debug Console? Remember I'm using Geronimo HEAD for 
most of this (I guess it's time for another maven m:update though).

Thanks for any insights you can give on better using JNDI and bridging 
the gap between the Web application and the EJB world.

Thanks.

-Neal



Mime
View raw message