2010-01-18 23 views
8

He tenido problemas al intentar llamar a un método de EJB desde un cliente de aplicación Java. Aquí está el código.Glassfish v3/JNDI entrada no se puede encontrar problemas!

EJB interfaz remota

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"; 

    } 

} 

Clase principal (otro proyecto)

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

    } 

} 

Bueno, ¿cuál es mi problema? ¡No se puede encontrar la entrada JNDI para este EJB!

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 

He tratando con diferentes entradas JNDI, pero nada funciona (Tengo este entradas de NetBeans consola):

INFORMACIÓN: nombres JNDI portátiles para EJB HelloBeanExample: [java: Global/Prueba/HelloBeanExample, java: Global/Prueba/HelloBeanExample com.test.HelloBeanRemote]

INFO: Glassfish-específicos (no portátiles) nombres JNDI de EJB HelloBeanExample: [EJB/HelloBean, EJB/HelloBean # com.test.HelloBeanRemote]

Así que probé con el siguiente entri ES pero me dio la misma excepción:

  1. java: Global/Prueba/HelloBeanExample
  2. java: Global/Prueba/HelloBeanExample com.test.HelloBeanRemote
  3. EJB/HelloBean
  4. EJB/HelloBean # com.test.HelloBeanRemote

¡Estoy usando Netbeans 6.8 y Glassfish v3!

Respuesta

17

En realidad, el problema es no la búsqueda de la referencia JNDI del bean o que obtendría algo así:

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

No, aquí, sospecho que un simple problema de ruta de clases, que está simplemente falta un jar en el classpath de su proyecto de cliente. Con GlassFish v3, agregar $GF_HOME/modules/gf-client.jar debería ser suficiente como se menciona en How do I access a Remote EJB component from a stand-alone java client? en GlassFish's EJB FAQ (mi entendimiento es que se supone que este jar reemplaza $GF_HOME/lib/appserv-rt.jar que está ahí por razones de compatibilidad con GFv2). Sin embargo, es importante referir el gf-client.jar desde el directorio de instalación de GlassFish o no se encontrarán los jar declarados en su manifiesto.

gf-client.jar se refiere a muchas otras .jars desde el directorio de instalación de GlassFish por lo que es mejor para referirse a él desde dentro del directorio de instalación en sí en lugar de copiarlo (y todos los demás .jars) a otra ubicación.

Una vez que tenga esto arreglado, debería poder buscar su bean utilizando los nombres JNDI que GlassFish genera en los registros. Sugiero usar los nuevos nombres JNDI globales portátiles de Java EE 6.

Por si acaso, la entrada What is the syntax for portable global JNDI names in EJB 3.1? de GlassFish EJB FAQ proporciona un buen resumen de esta nueva convención. Y si desea obtener más información, consulte: http://blogs.oracle.com/MaheshKannan/entry/portable_global_jndi_names.

0

¡He encontrado algo! ¡Creo que hay una "forma especial" de agregar y configurar componentes usando NetBeans! He estado leyendo los tutoriales de netbeans de las páginas web y aparentemente estaba haciendo las cosas mal. Por lo tanto, esta no es una solución real para este problema, pero tal vez si lees uno de esos http://netbeans.org/kb/trails/java-ee.html ¡encontrarás tus servidores!

Saludos

0

He encontrado el mismo problema. I busqué en Google la web y seguí tutoriales de Oracle línea por línea para configurar un cliente java independiente, pero todavía no funciona nada. Me encontré con http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html y tiene una información que ya he intentado resolver el problema.

Voy a reiniciar mi IDE, limpiar y construir el proyecto; también puede ser crear el proyecto de nuevo. Y quién sabe, cuando la luna está llena, mi código podría funcionar bien :) Así que podría intentarlo también

0

Mi cliente independiente finalmente se ejecuta! El truco fue, simplemente, reiniciar Netbeans IDE, anular la implementación de la aplicación y volver a implementarla. Esto debería solucionar su problema (suponiendo que no haya otro error en su código y configuración).

Cuestiones relacionadas