EJB - Lookup failed for 'ejb/BookRequestBean'

14,328

Solution 1

In addition to nice @RaviTrivedi answer, here are few thoughts:

  • @Named annotation shouldn't be used this way
  • don't use both name and mappedName, for Glassfish it is enough to use just mappedName
  • your EJB should implement remote interface

Solution 2

There can be several reasons to this:

1) Your EJB is not mapped to JNDI name. You need to check whether your EJB is deployed successfully and it is mapped to JNDI name. You can check Server GUI, Server Log on startup or use Universal Test Client to see if EJB is mapped correctly. Note, UTC will only show Remotely exposed EJBs.

2) Your EJB is only exposed to Local application. In this case, Remote call or Cross application call(different EAR, WAR...) to your EJB will fail. In this scenario, create Remote interface and expose it. Local interface exposes EJB to only local calls. Remote interface exposes EJB to remote or cross application calls.

3) Your RMI/IIOP port may be incorrect. You can check Glassfish GUI or Server startup log to see what port RMI/IIOP is assigned to.

Note: To diagnose the exact problem, please post full stack trace.

Solution 3

Adding to @Ravi Trivedi and @Miljen Mikic, if you are using Glassfish, you should check how your EJB is registered in JNDI. In Glassfish for example type the following command:

 asadmin list-jndi-entries
Share:
14,328

Related videos on Youtube

Pradeep Simha
Author by

Pradeep Simha

I am working as Java/Java EE developer, my interests are on Java technologies. I spend most of the time coding learning new technologies.

Updated on September 14, 2022

Comments

  • Pradeep Simha
    Pradeep Simha over 1 year

    I am new to EJB, and was trying "Hello World" type of EJB Java program. Here is my EJB:

    package dukesbookstore.ejb;
    @Stateless(name="BookRequestBean", mappedName="ejb/BookRequestBean")
    @Named
    public class BookRequestBean {
        //Other codes here
    }
    

    and here is my client:

        Properties prop = new Properties();
        prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
        prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
        prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
        try {
            InitialContext ctx = new InitialContext(prop);                              
            ctx.lookup("ejb/BookRequestBean");
            System.out.println("EJB Look-up successfull!!");
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    

    But whenever I try to run, I am getting below exception:

    javax.naming.NamingException: Lookup failed for 'ejb/BookRequestBean' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java

    I have added appserv-rt.jar , gf-client.jar, javaee.jar, but still no luck. Can anyone help me, what I am missing here? I am usign Glassfish 3.1

  • Ravi Trivedi
    Ravi Trivedi almost 11 years
    Slight interjection. name is used to identify EJB whereas mappedName is EJB's JNDI name. Also mappedName is vendor specific. ie: Glassfish supports, Websphere not.
  • Miljen Mikic
    Miljen Mikic almost 11 years
    @RaviTrivedi Yep, that's why I noted that it's enough for Glassfish. It shouldn't be used if you want fully portable applications.