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)
Может кто-нибудь помочь мне исправить ошибку? Я попытался исправить это несколько часов, но все еще не могу понять.
Ответы
Ответ 1
Нам нужно указать 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);
и
эти значения будут установлены при запуске контейнера в качестве аргументов JVM.
Так что если вы используете код в контейнере, то будет работать
InitialContext ctx = new InitialContext();
Ответ 2
Если вы работаете в клиентской библиотеке 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 factory. Единственная необходимая конфигурация - это проанализировать значение org.jboss.ejb.client.naming для свойства java.naming.factory.url.pkgs для создания экземпляра InitialContext.