Ошибка NoInitialContextException
Я пишу клиент для своего EJB, и, пытаясь его выполнить, я получаю следующее исключение:
javax.naming.NoInitialContextException: Необходимо указать имя класса в окружающей среды или системы, или как параметр апплета или в файл ресурсов приложения.
Я просто не понимаю, в чем проблема.
Ответы
Ответ 1
Пакет javax.naming
содержит JNDI API. Поскольку это просто API, а не реализация, вам нужно сказать, какую реализацию JNDI использовать. Реализации обычно специфичны для сервера, с которым вы пытаетесь разговаривать.
Чтобы указать реализацию, вы передаете объект Properties
при создании InitialContext
. Эти свойства определяют используемую реализацию, а также местоположение сервера. По умолчанию конструктор InitialContext
полезен только при наличии системных свойств, но свойства такие же, как если бы вы передавали их вручную.
Что касается свойств, которые необходимо установить, это зависит от вашего сервера. Вам нужно отследить эти настройки и подключить их.
Ответ 2
Является проблемой JNDI. Вы увидите это исключение, если класс InitialContext не имеет свойств по умолчанию для поставщика услуг JNDI или явно настроенных свойств сервера.
Задайте свойство среды Context.INITIAL_CONTEXT_FACTORY для имени класса начальной реализации контекста, который вы используете. Этот класс должен быть доступен вашей программе в пути к классам.
Check:
http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html
http://java.sun.com/products/jndi/tutorial/getStarted/TOC.html (проблемы времени выполнения)
Ответ 3
вам нужно поместить следующие пары имя/значение в Hashtable и вызвать этот конструктор:
public InitialContext(Hashtable<?,?> environment)
точные значения зависят от вашего сервера приложений, этот пример для 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
Ответ 4
Вы должны установить jndi.properties. Я привел ниже некоторые фрагменты кода, которые объясняют, как устанавливаются свойства для activemq. Как вы можете установить для своего приложения. Внутри контейнера J2EE, такого как JBoss, не нужно устанавливать эти свойства.
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");
Я знаю, что это поздний ответ, но просто для будущей справки.
Ответ 5
В частности, я получил эту проблему при попытке получить значение по умолчанию (no-args) InitialContext
во встроенном экземпляре Tomcat7 в SpringBoot.
Решение для меня состояло в том, чтобы сказать Tomcat enableNaming
.
то есть.
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
Ответ 6
Простое и настраиваемое решение создает один файл jndi.properties и помещает этот файл в classpath.
jndi.properties может быть создан как
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
Просто укажите свое имя factory и url и поместите этот файл в свой путь к классам. JMS будет получать необходимую информацию сама по себе, и ее легко настроить в будущем.
Ответ 7
В большинстве случаев эти параметры также определяются в файле jndi.properties
. У вас есть тот, кто лежит где-то?
Ответ 8
Моя проблема с этим состояла в том, что я создавал сеанс спящего режима, но неправильно настроил параметры JNDI для моего экземпляра базы данных из-за проблемы с classpath. Просто FYI...
Ответ 9
Я решил ту же проблему, добавив в проект следующие библиотеки Jar:
- AppServ-rt.jar
- javaee.jar
из папки: C:\Program Files\glassfish-4.0\glassfish\lib
Ссылки на эти библиотеки были сломаны, а Netbeans не нашли подходящих классов.
Ответ 10
убедитесь, что включены зависимости для именования причалов и причала плюс (не только предоставленная область).
Это исправило это для меня.
Ответ 11
Сделайте это:
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
Context initialContext = new InitialContext(props);
Также добавьте это в библиотеки проекта:
C:\installs\glassfish\glassfish-4.1\glassfish\lib\gf-client.jar
отрегулируйте путь соответственно
Ответ 12
вам нужно использовать jboss-client.jar в вашем проекте клиента, и вам нужно использовать jnp-client jar в проекте ejb