Der Zugriff auf einen Remote-Enterprise-Bean innerhalb einer einfachen Java-Klasse

StackOverflow https://stackoverflow.com/questions/1620803

  •  06-07-2019
  •  | 
  •  

Frage

Hier ist meine Java-Klasse

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

    }
}

Wenn ich laufe diese Klasse ich eine Ausnahme zu bekommen.

    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

Alle anderen Enterprise-Bean-Klassen werden nach dem Standard EJB 3.0 geschrieben. Ihr wertvoller Beitrag erwartet wird.

Lösung

Die Ausnahme war

javax.naming.NameNotFoundException: endpoint.NewSessionRemote not found

Es tritt auf, weil der JNDI-Name, der von der Anwendungsseite gegeben wurde, nicht der (Glassfish) actual JNDI Namen servser passen, so dass ich war in Glassish durch seine Admin-Konsole (herstellerspezifisch) die JNDI-Struktur überprüfen und ich habe feststellen, dass die JNDI für die NewSessionRemote Schnittstelle (die das Business-Schnittstelle der Session-Bean ist NewSessionBean ) unterscheidet sich von dem Namen, den ich in der Anwendungsseite gegeben haben. So, wie dies geschah dann plötzlich kam etwas meiner Meinung nach, dass der ist ejb-jar.xml ist ein anderer Name JNDI-Namen auf den gleichen zugewiesen NewSessionRemote mit Tag. So entferne ich sie einfach und EJB-Modul erneut bereitstellen. Das ist es.

War es hilfreich?

Lösung

Wenn JNDI verwenden, sind Sie eine API verwenden, die eine spezielle Konfiguration erfordert es, um Basiswert an den Server (siehe Javadoc für Details was die Konfiguration ist). Zum Beispiel java.naming.factory.initial ist die Eigenschaft, die die Implementierung von JNDI signalisiert, dass Sie verwenden möchten.

Nun, wenn Code in einem Java EE-Server ausgeführt wird, ist diese Konfiguration implizit vorhanden, und alles, was Sie tun müssen, ist das, was Sie in Ihrem Code getan haben - instanziiert InitialContext, und eine Suche durchführen. Wenn jedoch außerhalb des Servers ausgeführt wird, diese implizite Konfiguration nicht vorhanden ist, und so müssen Sie Ihre InitialContext explizit konfigurieren.

Ihr Beispielcode verwendet eine main() Methode, was darauf hindeutet, dass Sie außerhalb des Behälters laufen. Die Konfiguration müssen Sie auf Ihren spezifischen Anwendungsserver ab, Sie werden feststellen, dass Dokumentation nachschlagen müssen, um zu sehen, was Config zu liefern.

Andere Tipps

Sieht aus wie Sie keine RMI-Registrierung (das heißt aktiven Server) haben Sie sind lookingUp() gegen.

Sie geliefert keine Context.INITIAL_CONTEXT_FACTORY Variable, so sollte die Lookup eine gültige URL sein, was es nicht ist.

Daher sollten Sie so etwas wie diese auf Ihrem env (auf dem iCtx) setzen:

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

Ich schlage vor, Sie die einfachen Beispiele lesen über http://java.sun.com/j2se/1.5.0/docs/guide/jndi/jndi-rmi.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top