it-swarm.com.de

NoInitialContextException Fehler

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.

54
Attilah

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.

31
skaffman

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)

9
JuanZe

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
9
stacker

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.

8
nichu09

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);
        }
    };
}
6
Nick Grealy

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.

3
Vaibhav Jain

Meist sind diese Einstellungen auch in einer jndi.properties-Datei definiert. Hast du das irgendwo herumliegen?

2

Ich habe das gleiche Problem gelöst, indem ich meinem Projekt die folgenden Jar-Bibliotheken hinzugefügt habe:

  • appserv-rt.jar
  • javaee.jar

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.

2
Yannickv

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...

1
Thom

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.

0
Neocy

sie müssen jboss-client.jar in Ihrem Client-Projekt verwenden, und Sie müssen Jnp-Client-Jar in Ihrem EJB-Projekt verwenden

0
Sangram Badi

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

0
ACV