Fehlermeldung interpretieren?!

Hando84

Grünschnabel
Hallo,
könnte mir mal bitte jemand beim Interpretieren der folgenden Fehlermeldung helfen?

javax.naming.NoInitialContextException: Cannot instantiate class: com.sap.engine.services.jndi.InitialContextFactoryImpl [Root exception is java.lang.ClassNotFoundException: com.sap.engine.services.jndi.InitialContextFactoryImpl]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at com.sap.sdn.client.HelloWorldClient.main(HelloWorldClient.java:19)
Caused by: java.lang.ClassNotFoundException: com.sap.engine.services.jndi.InitialContextFactoryImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 4 more


ausgelöst in folgender Applikation:

package com.sap.sdn.client;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

import com.sap.sdn.ejb.HelloWorldRemote;

public class HelloWorldClient {
public static void main(String[] args) {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sap.engine.services.jndi.InitialContextFactoryImpl");
props.put(Context.PROVIDER_URL, "cpex-e.telekom.de:50204");

try {
Context ctx = new InitialContext(props);
Object o = ctx.lookup(
"com.tsi/MS_HelloWorldEAR2/REMOTE/HelloWorldBean/com.sap.sdn.ejb.HelloWorldRemote");
HelloWorldRemote helloRef = (HelloWorldRemote)
PortableRemoteObject.narrow(o, HelloWorldRemote.class);
String msg = helloRef.sayHello("Friend");
System.out.println(msg);

} catch (Exception e) {
e.printStackTrace();
}
}
}

Wäre nett, wenn mir mal jemand helfen würde. Hab davon net wirklich Ahnung.

Mfg Michael
 
Per String übergebene Klassennamen, die per reflection aufgelöst werden, wie com.sap.engine.services.jndi.InitialContextFactoryImpl, werden nicht automatisch über das IDE aufgelöst.
Ich würde als erstes versuchen, die Klasse in den classpath zu bekommen, z.B. indem das ganze sap-jar in den classpath gelinkt wird. Die Anwendung sieht nach einer appserver Laufzeitumgebung aus. Man könnte dem appserver das sap-jar in einen Lib-Ordner legen.
 
ok vielen danke, das problem hab ich mal behoben, aber da kommt auch schon die nächste fehlermeldung :(

com.sap.engine.services.jndi.persistent.exceptions.NameNotFoundException: Path to object does not exist at MS_HelloWorldEAR2, the whole lookup name is com.tsi/MS_HelloWorldEAR2/REMOTE/HelloWorldBean/com.sap.sdn.ejb.HelloWorldRemote.
...

ich gehe mal davon aus, dass ich den lookup-pfad falsch angegeben habe, aber ich wüsste ehrlich gesagt net was daran falsch sein soll...
 
Es scheint so, als ob der JNDI Name zur Laufzeit nicht aufgelöst werden kann.

Appserver haben meistens eine adminoberfläche, in der kann der jndi Name, der auf dem Server gilt nachgeschlagen werden.

Im WebSphere Appserver wäre das:
Anwendungen - > NameDerAnwendung -> JNDI Namen der EJBs

Welchen appserver verwendest du?
 
Nun stehe ich vor dem nächsten Schritt. ich möchste das ganze lokal auf einem server laufen lassen, indem ich eine JSP einbinde, welche sich jedoch getrennt von der Bean in einem eigenen EAR befinden soll.

Und zwar befindet sich ja meine Bean in einem EAR und meine JSP in einem EAR. Diese beiden deploye ich dann auf den Server und will diese dann über den Browser ausführen.
Habe einfach mal trivial den Quelltext genommen, in einer JSP verbaut und das ganze so getestet. Aber irgendwie funktioniert das ganze net so.
Muss ich denn wenn das ganze ja lokal läuft den aufruf an den server überhaupt noch durchführen, oder muss ich anstelle der ip einfach "localhost" schreiben oder wie funktioniert das?
Kann ich das Programm überhaupt so in eine JSP übernehmen?
Wollte an dieser Stelle dann auch das local-interface ansprechen und nicht mehr das remote.
Muss ich die jar-Datei in meine library des JSP aufnehmen, damit die Pfade und Interfaces bekannt sind?

Komme echt net weiter. Vielleicht weiss ja hier einer Rat.

Mfg Michael
 
Zuletzt bearbeitet:
Was genau geht denn nicht, bzw. hast du eine Fehlermeldung?
Die Referenzen auf das EJB müssen im Webprojekt der jsp enthalten sein, normalerweise gibt es einen Eintrag im deploymentdescriptor.
Für den deploymentdescriptor gibt es je nach IDE und Appserver assistenten um dort Referenzen eintragen zu können.

Welches IDE und welchen Applicationserver verwendets du?
Ein an die Technologie angepasstes HelloWorld-ejb Beispiel würde dir da am meisten helfen denke ich.
 

Neue Beiträge

Zurück