Pregunta

Aquí está mi clase de Java

import endpoint.NewSessionRemote;
import javax.naming.Context;
import javax.naming.InitialContext;

public class HelloClient {

    public static void main(String[] args) {
        try {
            Context ctx = new InitialContext();
            NewSessionRemote hello = (NewSessionRemote) ctx.lookup("endpoint.NewSessionRemote");
            System.out.println(hello.stringChange(4));
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

Cuando ejecuto esta clase, obtengo una excepción.

    javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found
        at com.sun.enterprise.naming.TransientContext.doLookup(TransientContext.java:216)
        at com.sun.enterprise.naming.TransientContext.lookup(TransientContext.java:188)
        at com.sun.enterprise.naming.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:74)
        at com.sun.enterprise.naming.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:129)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
java.lang.NullPointerException

Todas las demás clases de enterprise bean se escriben de acuerdo con el estándar EJB 3.0. Se espera su valiosa contribución.

Solución

La excepción fue

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

Ocurre porque el nombre JNDI que fue dado por el lado de la aplicación no coincidía con el nombre JNDI real del servidor (Glassfish), así que lo hice fue verificar el árbol JNDI en Glassish a través de su consola de administración (proveedor específico) y lo hice observe que el JNDI para la interfaz NewSessionRemote (que es la interfaz de negocios del bean de sesión NewSessionBean ) es diferente del nombre que he dado en el lado de la aplicación. Entonces, ¿cómo sucedió esto? Entonces, de repente, algo vino a mi mente que es el ejb-jar.xml . Hay otro nombre JNDI asignado a la misma etiqueta NewSessionRemote . Así que simplemente lo quito y vuelvo a desplegar el módulo EJB. Eso es todo.

¿Fue útil?

Solución

Cuando utiliza JNDI, está utilizando una API que requiere una configuración específica subyacente para poder conectarse al servidor (consulte Javadoc para obtener detalles sobre qué es esa configuración). Por ejemplo, java.naming.factory.initial es la propiedad que indica qué implementación de JNDI desea utilizar.

Ahora, cuando ejecuta código dentro de un servidor JavaEE, esta configuración está disponible implícitamente, y todo lo que necesita hacer es lo que ha hecho en su código: crear una instancia de InitialContext y realizar una búsqueda. Sin embargo, cuando se ejecuta fuera del servidor, esta configuración implícita no está presente, por lo que debe configurar su InitialContext explícitamente.

Su código de muestra utiliza un método main () , que sugiere que se está ejecutando fuera del contenedor. La configuración que necesita dependerá de su servidor de aplicaciones específico, deberá buscar esa documentación para ver qué configuración debe suministrar.

Otros consejos

Parece que no tiene un registro de RMI (es decir, un servidor activo) contra el que está mirando hacia arriba () .

Usted no proporcionó ninguna variable Context.INITIAL_CONTEXT_FACTORY , por lo que la búsqueda debe ser una URL válida, pero no lo es.

Por lo tanto, debes poner algo como esto en tu env (en el iCtx ):

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");

Le sugiero que lea los ejemplos simples en http://java.sun.com/j2se/1.5.0/docs/guide/jndi/jndi-rmi.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top