Значение ошибки NoInitialContextException - PullRequest
58 голосов
/ 06 октября 2009

Я пишу клиент для моего EJB и при попытке его выполнить получаю следующее исключение:

javax.naming.NoInitialContextException: необходимо указать имя класса в среде или системном свойстве, или как параметр апплета, или в файл ресурсов приложения.

Я просто не могу понять, в чем проблема.

Ответы [ 12 ]

33 голосов
/ 01 января 2010

Пакет javax.naming содержит API JNDI. Поскольку это всего лишь API, а не реализация, вам нужно указать, какую реализацию JNDI использовать. Реализации обычно относятся к серверу, с которым вы пытаетесь общаться.

Чтобы указать реализацию, вы передаете объект Properties при создании InitialContext. Эти свойства определяют используемую реализацию, а также местоположение сервера. Конструктор InitialContext по умолчанию полезен только при наличии системных свойств, но свойства такие же, как если бы вы передали их вручную.

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

11 голосов
/ 18 ноября 2013

Вы должны установить 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");  

Я знаю, что это поздний ответ, но я просто даю справку на будущее.

10 голосов
/ 31 декабря 2009

вам нужно поместить следующие пары имя / значение в хеш-таблицу и вызвать этот конструктор:

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
10 голосов
/ 06 октября 2009

Это проблема JNDI. Вы увидите это исключение, если класс InitialContext не имеет ни свойств по умолчанию для поставщика услуг JNDI, ни явно настроенных свойств сервера.

Установите для свойства среды Context.INITIAL_CONTEXT_FACTORY имя класса исходной реализации контекста, которую вы используете. Этот класс должен быть доступен вашей программе в classpath.

Проверка:

6 голосов
/ 05 мая 2016

В частности, эта проблема возникла при попытке получить значение по умолчанию (без аргументов) InitialContext во встроенном экземпляре Tomcat7 в SpringBoot.

Решением для меня было сообщить Tomcat enableNaming.

т.е.

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    return new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            tomcat.enableNaming();
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }
    };
}
4 голосов
/ 11 августа 2015

Простое и настраиваемое решение - создать один файл 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

Просто укажите вашу фабрику имен и URL и поместите этот файл в ваш путь к классам. JMS сама получит необходимую информацию, и ее легко настроить в будущем.

2 голосов
/ 30 апреля 2014

Я решил ту же проблему, добавив в свой проект следующие библиотеки Jar:

  • AppServ-rt.jar
  • javaee.jar

из папки: C:\Program Files\glassfish-4.0\glassfish\lib

Ссылки на эти библиотеки были разорваны, и Netbeans не нашел подходящих классов для использования.

2 голосов
/ 11 августа 2010

В большинстве случаев эти настройки также определяются в файле jndi.properties. У вас где-нибудь есть этот?

1 голос
/ 27 октября 2011

Моя проблема с этим состояла в том, что я создавал сеанс гибернации, но у меня были неправильные настройки JNDI для моего экземпляра базы данных из-за проблемы пути к классам. Просто к вашему сведению ...

0 голосов
/ 07 сентября 2016

вам нужно использовать jboss-client.jar в вашем клиентском проекте и вам нужно использовать jnp-client jar в вашем проекте ejb

...