Die Suche nach Objektverweisen über JNDI führt zu einer ClassCastException
Frage
Ich habe Probleme, EJB3 Stateless Bean außerhalb des Containers aufzurufen.
Code zum Abrufen der Objektreferenz:
Context envCtx = (Context) context.lookup("ejb");
MyObject o = (MyObject) envCtx.lookup(MyObject);
Die zweite Zeile führt zu einer Ausnahme:
java.lang.ClassCastException: javax.naming.Reference
Ich verwende JBoss.org 5.1.0 GA.
Aufgrund einiger anderer Beiträge vermute ich, dass dies an der falschen Version der Client-Bibliotheken liegen könnte.Allerdings bin ich mir nicht sicher, welche(s) Bibliotheks-JAR(s) ich in das JAR aufnehmen soll?(Ich erhalte den Fehler bei Verwendung von 5.0.4.GA jnpserver.)
Lösung
Für JBoss sollte Ihr Code etwa so aussehen:
Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");
Context context = new InitialContext(properties);
(EchoBeanRemote) c.lookup("EchoBean/remote");
Wenn Sie möchten, können Sie die JNDI-Umgebungseinstellungen in a einfügen jndi.properties
Datei (die sich im Klassenpfad befinden muss):
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099
Und verwenden Sie das Nicht-Argument InitialContext
Konstrukteur:
Context context = new InitialContext();
(EchoBeanRemote) c.lookup("EchoBean/remote");
Dies ist offensichtlich tragbarer.
Und in beiden Fällen benötigen Sie jbossall-client.jar
im Klassenpfad auf der Clientseite.
P.S.:Sie können das überprüfen Globaler JNDI-Name Ihre Bean ist in der registriert JNDI-Ansicht der webbasierten JMX-Konsole (falls noch vorhanden).