2013-04-03 2 views
11

Вот мой код:javax.naming.NoInitialContextException - Java

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, не сообщает о каких-либо ошибок в коде выше - я в состоянии успешно скомпилировать. Однако, когда я пытаюсь запустить его, я получаю следующее исключение:

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) 

Может ли кто-нибудь помочь мне исправить ошибку? Я попытался исправить это несколько часов, но все еще не могу понять.

+0

https://docs.oracle.com/javase/tutorial/jndi/ops/faq.html#1 –

ответ

18

Мы должны указать INITIAL_CONTEXT_FACTORY, PROVIDER_URL, USERNAME, PASSWORD и т. Д. JNDI, чтобы создать InitialContext.

В отдельном приложении, вы можете указать, что, как показано ниже

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

Но если вы используете свой код в контейнере Java EE, эти значения будут быть извлечены контейнером и используются для создания InitialContext, как ниже

System.getProperty(Context.PROVIDER_URL); 

и

эти значения будут установлены при запуске контейнера в качестве аргументов виртуальной машины Java. Так что, если вы работаете код в контейнере, следующий будет работать

InitialContext ctx = new InitialContext(); 
+0

Что вы подразумеваете под «запуском кода в контейнере»? – kittu

+2

Как я понимаю, контейнер - это tomcat, jboss и т. Д. –

0

При работе на клиентской библиотеке EJB:

Вы должны упомянуть аргумент для получения начального контекста.

InitialContext ctx = new InitialContext(); 

Если вы этого не сделаете, это будет выглядеть в папке проекта для файла свойств. Также вы можете включить свойства учетных данные или значение в вашем самом файле класса следующим образом:

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: константу, которая содержит имя свойства среды для определения списка пакетов префиксов для использования при загрузке в URL контекстных заводов.

Клиентская библиотека EJB является основной библиотекой для вызова удаленных компонентов EJB.
Эта библиотека может использоваться через InitialContext. Чтобы вызвать компоненты EJB, библиотека создает контекст клиента EJB через фабрику контекста URL. Единственная необходимая конфигурация - это проанализировать значение org.jboss.ejb.client.naming для свойства java.naming.factory.url.pkgs для создания экземпляра InitialContext.

Смежные вопросы