14 Replies Latest reply: Feb 4, 2006 4:18 PM by Ralf Quebbemann RSS

InitialContext()

Dornus Novice

Which way should we call InitalContext now?

According to this file
http://docs.jboss.org/ejb3/embedded/embedded-tutorial/embedded-war/src/EmbeddedEJB3.jsp it looks like it can be called both ways.

Way #1:

InitialContext ctx = getInitialContext();
 CustomerDAOLocal local = (CustomerDAOLocal) ctx.lookup(CustomerDAOLocal.class.getName());


Way#2:
Queue queue = (Queue) getInitialContext().lookup("queue/mdbtest");

public static InitialContext getInitialContext() throws Exception
 {
 Hashtable props = getInitialContextProperties();
 return new InitialContext(props);
 }

 private static Hashtable getInitialContextProperties()
 {
 Hashtable props = new Hashtable();
 props.put("java.naming.factory.initial", "org.jnp.interfaces.LocalOnlyContextFactory");
 props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
 return props;
 }


  • 1. Re: InitialContext()
    Bill Burke Master

    Yikes, I think I forgot to test the embedded war example!

    it should be:

     CustomerDAOLocal local = (CustomerDAOLocal) ctx.lookup("CustomerDAOBean/local");
    


  • 2. Re: InitialContext()
    Dornus Novice

    So then it was choice 3? :)

    so when do we use way #2? Where we have to define our own static hashtable. Or is that just for a specific case that most people won't use?

    Also, what do we do with way#3 when it's not specifically set to remote or local? My beans currently don't have a local or remote tag...just public interface MyClassName

  • 3. Re: InitialContext()
    Bill Burke Master

    There two different concepts here:

    #1 Getting a javax.naming.InitialContext. When using E-EJB3 within a WAR (in Tomcat for example), you must set the InitialContext properties as shown as JBoss uses its own JNDI implementation within E-EJB3 even within Tomcat. We may fix this in the future.

    #2 The lookup of the EJB which, by default uses the form:

    "EJB-NAME/local" or "EJB-NAME/remote". See the docs, WIKI, and release notes for more detail.

  • 4. Re: InitialContext()
    Dornus Novice

    So if my Stateless bean does not have a local/remote, I cannot call it using InitialContext???

    I'm assuming this is what's leading to my

    javax.naming.NameNotFoundException: myPath.myClass not bound
    

    exception.


    Do I have to make an empty @Local bean which extends my interface class?

  • 5. Re: InitialContext()
    Bill Burke Master

    Your bean class must implementat at least one interface. If these interfaces are nto annotated with @Remote or @Local, the EJB container assumes they are local interfaces. To look up a local interface do:

    initialContext.lookup("EJB-NAME/local");

    where EJB-NAME is the unqualified bean class name

  • 6. Re: InitialContext()
    Dornus Novice

    ok, I already have it set up like that, so all my beans have a local interface. Now that I changed the InitialContext.lookup to "BeanName/local") I am getting another error as a result

    Caused by: java.lang.RuntimeException: For EJB MyCustomBean could not find jndi binding based on interface only for @EJB(myPath.MyCustomBean) not used by any EJBs
     at org.jboss.ejb3.injection.EJBHandler.getJndiName(EJBHandler.java:216)
     at org.jboss.ejb3.injection.EJBHandler.loadFieldInjectors(EJBHandler.java:326)
     at org.jboss.ejb3.injection.EJBHandler.loadInjectors(EJBHandler.java:78)
     at org.jboss.ejb3.injection.EJBHandler.loadInjectors(EJBHandler.java:57)
     at org.jboss.ejb3.EJBContainer.resolveInjectors(EJBContainer.java:651)
     at org.jboss.ejb3.EJBContainer.initializePool(EJBContainer.java:586)
     at org.jboss.ejb3.EJBContainer.start(EJBContainer.java:518)
     at org.jboss.ejb3.SessionContainer.start(SessionContainer.java:82)
     at org.jboss.ejb3.stateless.StatelessContainer.start(StatelessContainer.java:80)
     ... 126 more
    




  • 7. Re: InitialContext()
    Dornus Novice

    My setup is the following

    @Stateless
    public SomeClass{
     @EJB
     MyCustomBean myBean;
    }
    
    

    SomeClass and MyCustomBean both reside in the same folder and same .ejb3 jar file.

  • 8. Re: InitialContext()
    Dornus Novice

    Hmm, if I'm calling it as @EJB MyCustomBean, then the InitialContext.lookup isn't the problem here...

    This worked with the previous release RC3.

    The only thing I can think of is my ear structure. Do I have to have everything end in .jar for this to work?
    Currently I have something like this...

    MyTest.ear
    - MyTest.ejb3 (EJB3 beans)
    - MyTest.par (Entity beans)
    - MyTest.jar (Regular beans
    - MyTest.war (Jsp/Servlets)

  • 9. Re: InitialContext()
    Bill Burke Master

    Don't be mad but you need to learn EJB 101. You don't reference bean classes directly. YOu reference their interfaces:

    @Stateless
    public class MyCustomBean implements MyCustom {
    }


    @Stateless
    public SomeClass implemetns ... {

    @EJB MyCustom
    }

  • 10. Re: InitialContext()
    Dornus Novice


    Yeah I usually do call it by the interface name.

    However in one of the tutorials I downloaded I noticed the lookup was called using the bean directly
    BeanName/local

    Instead of the interface.

    So i assumed it changed between versions.

    I still have it as
    @EJB MyBeanInterface

    but I changed lookups to "MyBeanDirectly/local"

    However I'm still getting an exception with the @EJB tag.

  • 11. Re: InitialContext()
    Dornus Novice

    The example I saw it on was here:
    ...\jboss-EJB-3.0_RC4-PFD\jboss-EJB-3.0_RC4-PFD\docs\tutorial\stateless\src\org\jboss\tutorial\stateless\client\Client.java

    ...
     InitialContext ctx = new InitialContext();
     Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/remote");
    


    And CalculatorBean is as follows
    @Stateless
    public class CalculatorBean implements CalculatorRemote, CalculatorLocal
    {
    ...
    }
    



  • 12. Re: InitialContext()
    Dornus Novice

    Hmm, odd it seems as though you do use the beanname convention to get it working

    InitialContext.lookup(EAR_FILE_NAME/BEAN_NAME/local);
    


  • 13. Re: InitialContext()
    Ralf Quebbemann Newbie

    Yep, that's it.
    I had the same problem. It worked when I deployed the ejb3 jar file standalone, but it didn't work when I used an ear.

    So I followed your recommendations and found out, that the exact name of the session bean deployed within an ear is:

    InitialContext.lookup(EAR_FILE_NAME_WITHOUT_EXTENSION/BEAN_NAME/local);

    Thanks

  • 14. Re: InitialContext()
    Ralf Quebbemann Newbie

    I was just thinking it that's really the way it's supposed to be? The client should and must not know about the filename of the ear. I consider this as a workaround.