It sounds like PhoneBookSessionUtil is trying to look up the JNDI
name:
org.acme.phonebook.ejb/PhoneBookSession/LocalHome
When really, based on the EJB ref you created, it should be
looking up:
java:comp/env/ejb/PhoneBookSessionLocal
There might be another method or constant in PhoneBookSessionUtil
that you can use to achieve this. Otherwise, just do this:
PhoneBookSessionLocal session = ((PhoneBookSessionHome)
ctx.lookup("java:comp/env/ejb/PhoneBookSessionLocal")).create();
If you get that working, you can forget about the jndi-name and
local-jndi-name (they won't be necessary unless you have an application
client).
Aaron
On Thu, 16 Jun 2005, Neal Sanche wrote:
> 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
>
>
>