web-dev-qa-db-fra.com

javax.naming.NoInitialContextException - Java

Voici mon code:

import javax.naming.InitialContext;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;

public class Sender
{
    public static void main(String[] args) throws Exception
    {
        // get the initial context
        InitialContext ctx = new InitialContext();

        // lookup the queue object
        Queue queue = (Queue) ctx.lookup("queue/queue0");

        // lookup the queue connection factory
        QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
           lookup("queue/connectionFactory");

        // create a queue connection
        QueueConnection queueConn = connFactory.createQueueConnection();

        // create a queue session
        QueueSession queueSession = queueConn.createQueueSession(false,Session.DUPS_OK_ACKNOWLEDGE);

        // create a queue sender
        QueueSender queueSender = queueSession.createSender(queue);
        queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // create a simple message to say "Hello"
        TextMessage message = queueSession.createTextMessage("Hello");

        // send the message
        queueSender.send(message);

        // print what we did
        System.out.println("sent: " + message.getText());

        // close the queue connection
        queueConn.close();
    }
}

Eclipse ne rapporte aucune erreur dans le code ci-dessus - je suis capable de compiler avec succès. Cependant, lorsque j'essaie de l'exécuter, j'obtiens l'exception suivante:

Exception in thread "main" javax.naming.NoInitialContextException: Need to specify       
class name in environment or system property, or as an applet parameter, or in an  application resource file:  Java.naming.factory.initial
  at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
  at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
  at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
  at javax.naming.InitialContext.lookup(Unknown Source)
  at Sender.main(Sender.Java:21)

Quelqu'un peut-il s'il vous plaît m'aider à corriger le bogue? J'ai essayé de le réparer pendant quelques heures mais je n'arrive toujours pas à le comprendre. 

12
king jia

Nous devons spécifier les paramètres INITIAL_CONTEXT_FACTORY, PROVIDER_URL, USERNAME, PASSWORD, etc. de JNDI pour créer une InitialContext.

Dans une application autonome, vous pouvez spécifier cela comme ci-dessous

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.Sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ldap.wiz.com:389");
env.put(Context.SECURITY_PRINCIPAL, "joeuser");
env.put(Context.SECURITY_CREDENTIALS, "joepassword");

Context ctx = new InitialContext(env);

Mais si vous exécutez votre code dans un conteneur Java EE, ces valeurs seront extraites par le conteneur et utilisées pour créer une InitialContext comme ci-dessous.

System.getProperty(Context.PROVIDER_URL);

et 

ces valeurs seront définies lors du démarrage du conteneur en tant qu'arguments JVM . Ainsi, si vous exécutez le code dans un conteneur, ce qui suit fonctionnera.

InitialContext ctx = new InitialContext();
18
JRR

Si vous travaillez sur la bibliothèque client EJB:

Vous devez mentionner l'argument pour obtenir le contexte initial. 

InitialContext ctx = new InitialContext();

Sinon, le fichier de propriétés sera recherché dans le dossier du projet. Vous pouvez également inclure les informations d'identification ou les valeurs des propriétés dans votre fichier de classe comme suit:

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");

InitialContext ctx = new InitialContext(props);

URL_PKG_PREFIXES: Constante qui contient le nom de la propriété d'environnement pour spécifier la liste des préfixes de package à utiliser lors du chargement dans des fabriques de contexte URL.

La bibliothèque client EJB est la bibliothèque principale pour appeler des composants EJB distants.
Cette bibliothèque peut être utilisée via InitialContext. Pour appeler des composants EJB, la bibliothèque crée un contexte client EJB via une fabrique de contexte URL. La seule configuration nécessaire consiste à analyser la valeur org.jboss.ejb.client.naming de la propriété Java.naming.factory.url.pkgs pour instancier un InitialContext.

0
Dhaval Simaria