2013-05-10 24 views
6

Sono nuovo di EJB e stavo provando il tipo di programma EJB Java "Hello World". Qui è la mia EJB:EJB - Ricerca fallita per 'ejb/BookRequestBean'

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

e qui è il mio cliente:

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(); 
    } 

Ma ogni volta che provo a correre, io sono sempre qui di seguito eccezione:

javax.naming.NamingException: Ricerca fallita per '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

Ho aggiunto appserv-rt.jar, gf-client.jar, javaee.jar, ma ancora senza fortuna. Qualcuno può aiutarmi, cosa mi manca qui? Sono usign Glassfish 3.1

+0

Lo stack stack completo sarebbe d'aiuto. Assicurati di dare un'occhiata anche a questo: http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB – LMeyer

risposta

2

Oltre alla bella risposta @RaviTrivedi, qui ci sono alcuni pensieri:

  • @Named annotazione non deve essere utilizzato in questo modo
  • non utilizzare sia name e mappedName, per Glassfish è sufficiente utilizzare solo mappedName
  • tuo bean deve implementare l'interfaccia remota
+0

Interiezione leggera. 'name' è usato per identificare EJB mentre' mappedName' è il nome JNDI dell'EJB. Anche 'mappedName' è specifico del venditore. vale a dire: supporti Glassfish, non Websphere. –

+0

@RaviTrivedi Sì, è per questo che ho notato che è sufficiente per Glassfish. Non dovrebbe essere usato se vuoi applicazioni completamente portatili. –

6

Ci possono essere diverse ragioni per questo:

1) tuo EJB non è mappata a JNDI nome. È necessario verificare se il tuo EJB è stato distribuito correttamente ed è mappato al nome JNDI. È possibile controllare Server GUI, Server Log on startup o utilizzare Universal Test Client per verificare se EJB è mappato correttamente. Nota: UTC mostra solo EJB esposti in remoto.

2) tuo EJB è esposto solo per locale applicazione. In questo caso, Chiamata remota o Chiamata cross-application (diverso EAR, WAR ...) al tuo EJB avrà esito negativo. In questo scenario, creare Interfaccia remota ed esporlo. L'interfaccia locale espone EJB solo alle chiamate locali. Interfaccia remota espone EJB a remoto o chiamate incrociate.

3) tuo RMI/IIOPporta potrebbe non essere corretto. È possibile controllare Glassfish GUI o Server startup log per vedere cosa è assegnato a portaRMI/IIOP.

Nota: Per diagnosticare il problema esatto, si prega di postare la traccia dello stack completo.

+0

+1, grazie per la risposta :) –

+0

Nessun problema amico, evviva! –

2

Aggiungendo a @Ravi Trivedi e @Miljen Miki c, se stai usando Glassfish, dovresti controllare come il tuo EJB è registrato in JNDI. Ad esempio, in Glassfish digita il seguente comando:

asadmin list-jndi-entries 
+0

per vedere EJB registrato in JNDI con asadmin - eccellente. – Thufir