Подтвердить что ты не робот

Ошибка NoInitialContextException

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

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

Я просто не понимаю, в чем проблема.

4b9b3361

Ответ 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