2010-01-18 27 views
8

Ho riscontrato problemi nel tentativo di chiamare un metodo EJB da un client di applicazioni Java. Ecco il codice.Problemi di Glassfish v3/JNDI non trovati!

EJB Interfaccia Remote

package com.test; 

import javax.ejb.Remote; 

@Remote 
public interface HelloBeanRemote { 

    public String sayHello(); 

} 

EJB

package com.test; 

import javax.ejb.Stateless; 

@Stateless (name="HelloBeanExample" , mappedName="ejb/HelloBean") 
public class HelloBean implements HelloBeanRemote { 

    @Override 
    public String sayHello(){ 

     return "hola"; 

    } 

} 

Classe principale (un altro progetto)

import com.test.HelloBeanRemote; 
import javax.naming.Context; 
import javax.naming.InitialContext; 

public class Main { 


    public void runTest()throws Exception{ 

     Context ctx = new InitialContext(); 
     HelloBeanRemote bean = (HelloBeanRemote)ctx.lookup("java:global/Test/HelloBeanExample!com.test.HelloBeanRemote"); 
     System.out.println(bean.sayHello()); 

    } 


    public static void main(String[] args)throws Exception { 

     Main main = new Main(); 
     main.runTest(); 

    } 

} 

Ebbene, qual è il mio problema? La voce JNDI per questo EJB non può essere trovata!

java.lang.NullPointerException 
     at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297) 
     at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271) 
     at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430) 
     at javax.naming.InitialContext.lookup(InitialContext.java:392) 
     at testdesktop.Main.runTest(Main.java:22) 
     at testdesktop.Main.main(Main.java:31) Exception in thread "main" javax.naming.NamingException: Lookup failed for 'java:global/Test/HelloBeanExample!com.test.HelloBeanRemote' in SerialContext [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext [Root exception is java.lang.NullPointerException]] 
     at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442) 
     at javax.naming.InitialContext.lookup(InitialContext.java:392) 
     at testdesktop.Main.runTest(Main.java:22) 
     at testdesktop.Main.main(Main.java:31) Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext [Root exception is java.lang.NullPointerException] 
     at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276) 
     at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430) 
     ... 3 more Caused by: java.lang.NullPointerException 
     at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297) 
     at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271) 
     ... 4 more Java Result: 1 

Ho provare con diverse voci JNDI ma non funziona niente (ho ottenuto questo voci da NetBeans console):

INFORMAZIONI: nomi JNDI portatili per EJB HelloBeanExample: [java: global/Test/HelloBeanExample, java: global/test/HelloBeanExample com.test.HelloBeanRemote]

INFORMAZIONI: Glassfish-specifici (non portatili) nomi JNDI per EJB HelloBeanExample: [ejb/HelloBean, ejb/HelloBean # com.test.HelloBeanRemote]

Così ho provato con il seguente entri ES ma ho avuto la stessa eccezione:

  1. java: global/Test/HelloBeanExample
  2. java:! globale/Test/HelloBeanExample com.test.HelloBeanRemote
  3. ejb/HelloBean
  4. ejb/HelloBean # com.test.HelloBeanRemote

Sto usando Netbeans 6.8 e Glassfish v3!

risposta

17

In realtà, il problema non è la ricerca del riferimento JNDI del bean oppure si otterrebbe qualcosa di simile:

Caused by: javax.naming.NameNotFoundException: ejb/HelloBean not found 

No, qui, ho il sospetto un problema semplice percorso di classe, si è semplicemente manca qualche jar sul classpath del tuo progetto client. Con GlassFish v3, l'aggiunta di $GF_HOME/modules/gf-client.jar dovrebbe essere sufficiente come menzionato in How do I access a Remote EJB component from a stand-alone java client? nelle domande frequenti EJB di GlassFish (mi risulta che questo jar sostituisca $GF_HOME/lib/appserv-rt.jar che esiste per motivi di compatibilità con GFv2). È tuttavia importante fare riferimento allo gf-client.jar dalla directory di installazione di GlassFish oppure i vasi dichiarati nel file manifest non verranno trovati.

gf-client.jar si riferisce a molti altri .jars dalla directory di installazione GlassFish, quindi è meglio fare riferimento ad esso all'interno della directory di installazione di per sé piuttosto che copiare (e tutti gli altri .jars) in un'altra posizione.

Una volta risolto questo problema, si dovrebbe essere in grado di cercare il bean utilizzando i nomi JNDI che GlassFish emette nei registri. Suggerirei di utilizzare i nuovi nomi JNDI globali portatili da Java EE 6.

Nel caso, la voce What is the syntax for portable global JNDI names in EJB 3.1? dalle domande frequenti sui bean GlassFish fornisce un riepilogo di questa nuova convenzione. E se vuoi maggiori informazioni, dai un'occhiata a: http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names.

0

Ho trovato qualcosa! Penso che ci sia un "modo speciale" per aggiungere e configurare componenti usando NetBeans! Ho letto i tutorial di netbeans dalle pagine web e apparentemente stavo facendo le cose sbagliate! Quindi, questa non è una soluzione reale per questo problema, ma forse se leggi uno di quelli http://netbeans.org/kb/trails/java-ee.html troverai i tuoi cancri!

Saluti

0

Ho riscontrato lo stesso problema. I googled il Web e ho seguito i tutorial di Oracle riga per riga per configurare un client Java autonomo, ma ancora niente funziona. Mi sono imbattuto in http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html e ha un'informazione che ho già provato a risolvere il problema.

mi limiterò a riavviare il mio IDE, pulito e generare il progetto; potrebbe essere anche creare il progetto di nuovo. E chissà, quando la luna è piena, il mio codice potrebbe funzionare bene :) Quindi potrei provare anche io

0

Il mio client stand-alone finalmente funziona! Il trucco era, basta riavviare Netbeans IDE, annullare la distribuzione dell'applicazione e ridistribuirla. Questo dovrebbe risolvere il tuo problema (supponendo che non ci siano altri errori nel codice e nella configurazione).

Problemi correlati