web-dev-qa-db-fra.com

Erreur NoInitialContextException

J'écris un client pour mon EJB et lorsque j'essaie de l'exécuter, je reçois l'exception suivante:

javax.naming.NoInitialContextException: Besoin de spécifier le nom de la classe dans environnement ou propriété du système, ou en tant que un paramètre d'applet, ou dans un fichier de ressources d'application.

Je ne peux tout simplement pas comprendre quel est le problème.

54
Attilah

Le package javax.naming comprend l'API JNDI. S'agissant d'une API plutôt que d'une implémentation, vous devez lui indiquer quelle implémentation de JNDI utiliser. Les implémentations sont généralement spécifiques au serveur avec lequel vous essayez de parler.

Pour spécifier une implémentation, vous passez un objet Properties lors de la construction de InitialContext. Ces propriétés spécifient l'implémentation à utiliser, ainsi que l'emplacement du serveur. Le constructeur par défaut InitialContext est utile uniquement lorsque des propriétés système sont présentes, mais elles sont identiques à celles que vous aviez passées manuellement.

Quant aux propriétés que vous devez définir, cela dépend de votre serveur. Vous devez rechercher ces paramètres et les brancher.

31
skaffman

Est un problème JNDI. Vous verrez cette exception si la classe InitialContext n'a pas de propriétés par défaut pour le fournisseur de service JNDI ni de propriétés de serveur explicitement configurées.

Définissez la propriété d'environnement Context.INITIAL_CONTEXT_FACTORY sur le nom de classe de l'implémentation de contexte initiale que vous utilisez. Cette classe doit être disponible pour votre programme dans le classpath.

Vérifier:

http://docs.Oracle.com/javase/7/docs/api/javax/naming/InitialContext.html

http://Java.Sun.com/products/jndi/tutorial/getStarted/TOC.html (problèmes d'exécution)

9
JuanZe

vous devez mettre les paires nom/valeur suivantes dans une table de hachage et appeler ce constructeur:

public InitialContext(Hashtable<?,?> environment)

les valeurs exactes dépendent de votre serveur d'application, cet exemple concerne 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

Vous devez définir jndi.properties. J'ai donné ci-dessous un morceau de code expliquant comment les propriétés sont définies pour activemq. Comme cela, vous pouvez définir pour votre application. Dans un conteneur J2EE tel que JBoss, il n'est pas nécessaire de définir ces propriétés.

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");  

Je sais que c'est une réponse tardive, mais je ne fais que donner pour référence future.

8
nichu09

Plus précisément, j'ai eu ce problème lorsque j'essayais de récupérer la valeur par défaut (no-args) InitialContext dans une instance intégrée de Tomcat7, dans SpringBoot.

La solution pour moi était de dire à Tomcat de enableNaming.

c'est à dire.

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    return new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            Tomcat.enableNaming();
            return super.getTomcatEmbeddedServletContainer(Tomcat);
        }
    };
}
6
Nick Grealy

La solution simple et configurable consiste à créer un fichier jndi.properties et à le placer dans le chemin de classe . Jndi.properties peut être créé comme

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

Il suffit de spécifier votre nom et votre URL et de placer ce fichier dans votre chemin de classe. JMS récupérera les informations requises par lui-même et sera facilement configurable à l'avenir également.

3
Vaibhav Jain

La plupart du temps, ces paramètres sont également définis dans un fichier jndi.properties. Avez-vous celui-là traîner quelque part?

2
Maarten van Leunen

J'ai résolu le même problème en ajoutant les bibliothèques de binaires suivantes à mon projet:

  • appserv-rt.jar
  • javaee.jar

depuis le dossier: C:\Program Files\glassfish-4.0\glassfish\lib

Les liens vers ces bibliothèques étaient rompus et Netbeans n’avait pas trouvé les bonnes classes à utiliser.

2
Yannickv

Mon problème avec celui-ci était que je créais une session de mise en veille prolongée, mais les paramètres JNDI pour mon instance de base de données étaient incorrects en raison d'un problème de chemin de classe. Juste FYI...

1
Thom

assurez-vous que les dépendances pour le nommage et la jetée plus sont incluses (pas seulement la portée fournie) .__ Cela a résolu le problème pour moi.

0
Neocy

vous devez utiliser jboss-client.jar dans votre projet client et vous devez utiliser jnp-client jar dans votre projet ejb

0
Sangram Badi

Faire ceci:

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.Sun.enterprise.naming.SerialInitContextFactory");
Context initialContext = new InitialContext(props);

Ajoutez également ceci aux bibliothèques du projet:

C:\installs\glassfish\glassfish-4.1\glassfish\lib\gf-client.jar ajuster le chemin en conséquence

0
ACV