Ich schreibe einen Client für mein EJB und wenn ich versuche, es auszuführen, erhalte ich die folgende Ausnahme:
javax.naming.NoInitialContextException: Der Klassenname muss in .__ angegeben werden. Umgebung oder Systemeigenschaft oder als einen Applet-Parameter oder in einem Anwendungsressourcendatei.
Ich kann einfach nicht verstehen, was das Problem ist.
Das javax.naming
-Paket umfasst die JNDI-API. Da es sich nicht um eine Implementierung, sondern um eine API handelt, müssen Sie angeben, welche JNDI-Implementierung verwendet werden soll. Die Implementierungen sind normalerweise spezifisch für den Server, mit dem Sie sprechen möchten.
Um eine Implementierung anzugeben, übergeben Sie ein Properties
-Objekt, wenn Sie die InitialContext
erstellen. Diese Eigenschaften geben die zu verwendende Implementierung sowie den Standort des Servers an. Der InitialContext
-Standardkonstruktor ist nur nützlich, wenn Systemeigenschaften vorhanden sind. Die Eigenschaften sind jedoch dieselben, als wenn Sie sie manuell übergeben hätten.
Welche Eigenschaften Sie einstellen müssen, hängt von Ihrem Server ab. Sie müssen diese Einstellungen festlegen und anschließen.
Ist ein JNDI-Problem. Diese Ausnahme wird angezeigt, wenn die InitialContext-Klasse weder Standardeigenschaften für den JNDI-Service-Provider noch explizit konfigurierte Servereigenschaften aufweist.
Legen Sie die Context.INITIAL_CONTEXT_FACTORY-Umgebungseigenschaft auf den Klassennamen der ursprünglichen Kontextimplementierung fest, die Sie verwenden. Diese Klasse muss für Ihr Programm im Klassenpfad verfügbar sein.
Prüfen:
http://docs.Oracle.com/javase/7/docs/api/javax/naming/InitialContext.html
http://Java.Sun.com/products/jndi/tutorial/getStarted/TOC.html (Laufzeitprobleme)
sie müssen die folgenden Name/Wert-Paare in eine Hashtable einfügen und diesen Konstruktor aufrufen:
public InitialContext(Hashtable<?,?> environment)
die genauen Werte hängen von Ihrem Anwendungsserver ab. Dieses Beispiel bezieht sich auf JBoss
jndi.Java.naming.provider.url=jnp://localhost:1099/
jndi.Java.naming.factory.url=org.jboss.naming:org.jnp.interfaces
jndi.Java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
Sie sollten jndi.properties einstellen. Ich habe unten ein Stück Code gegeben, der erklärt, wie die Eigenschaften für activemq festgelegt werden. So können Sie Ihre Bewerbung einstellen. In einem J2EE-Container wie JBoss müssen diese Eigenschaften nicht festgelegt werden.
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.Apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");
InitialContext ctx = new InitialContext(props);
// get the initial context
// InitialContext ctx = new InitialContext();
QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
// create a queue connection
QueueConnection queueConn = connFactory.createQueueConnection();
queueConn.start();
// lookup the queue object
Queue queue = (Queue) ctx.lookup("dynamicQueues/Payment_Check");
Ich weiß, dass dies eine späte Antwort ist, aber nur als Referenz für die Zukunft.
Dieses Problem ist insbesondere beim Versuch aufgetreten, die Standardvariable (no-args) InitialContext
in einer eingebetteten Tomcat7-Instanz in SpringBoot abzurufen.
Die Lösung für mich bestand darin, Tomcat enableNaming
mitzuteilen.
d.h.
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
Tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(Tomcat);
}
};
}
Einfache und konfigurierbare Lösung ist das Erstellen einer Datei jndi.properties, und legen Sie diese Datei in den Klassenpfad . Jndi.properties kann als erstellt werden
Java.naming.factory.initial = org.Apache.activemq.jndi.ActiveMQInitialContextFactory
# use the following property to configure the default connector
Java.naming.provider.url = vm://localhost
# use the following property to specify the JNDI name the connection factory
# should appear as.
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry
# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue
# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic
Geben Sie einfach Ihre Namensfabrik und den URL an und fügen Sie diese Datei in Ihren Klassenpfad ein. JMS holt die benötigten Informationen selbst ab und ist auch in Zukunft einfach konfigurierbar.
Meist sind diese Einstellungen auch in einer jndi.properties
-Datei definiert. Hast du das irgendwo herumliegen?
Ich habe das gleiche Problem gelöst, indem ich meinem Projekt die folgenden Jar-Bibliotheken hinzugefügt habe:
aus dem Ordner: C:\Program Files\glassfish-4.0\glassfish\lib
Die Links zu diesen Bibliotheken waren unterbrochen und Netbeans fand nicht die richtigen Klassen für die Verwendung.
Mein Problem dabei war, dass ich eine Ruhezustandssitzung erstellte, die JNDI-Einstellungen für meine Datenbankinstanz jedoch aufgrund eines Klassenpfadproblems falsch waren. Nur zur Info...
stellen Sie sicher, dass Abhängigkeiten für die Anlegestelle und Jetty Plus enthalten sind (nicht nur im angegebenen Umfang). Das hat es für mich behoben.
sie müssen jboss-client.jar in Ihrem Client-Projekt verwenden, und Sie müssen Jnp-Client-Jar in Ihrem EJB-Projekt verwenden
Mach das:
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.Sun.enterprise.naming.SerialInitContextFactory");
Context initialContext = new InitialContext(props);
Fügen Sie dies auch den Bibliotheken des Projekts hinzu:
C:\installs\glassfish\glassfish-4.1\glassfish\lib\gf-client.jar
Pfad entsprechend anpassen