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.
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.
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)
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
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.
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);
}
};
}
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.
La plupart du temps, ces paramètres sont également définis dans un fichier jndi.properties
. Avez-vous celui-là traîner quelque part?
J'ai résolu le même problème en ajoutant les bibliothèques de binaires suivantes à mon projet:
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.
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...
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.
vous devez utiliser jboss-client.jar dans votre projet client et vous devez utiliser jnp-client jar dans votre projet ejb
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