NoInitialContextException错误的含义

时间:2009-10-06 12:50:23

标签: java java-ee jndi

我正在为EJB编写客户端,在尝试执行它时,我得到以下异常:

  

javax.naming.NoInitialContextException:需要指定类名   在环境或系统属性中,或作为applet参数,或在   应用程序资源文件。

我无法理解问题所在。

12 个答案:

答案 0 :(得分:32)

javax.naming包包含JNDI API。因为它只是一个API,而不是一个实现,所以你需要告诉它使用哪个JNDI实现。这些实现通常特定于您尝试与之交谈的服务器。

要指定实现,请在构造Properties时传入InitialContext对象。这些属性指定要使用的实现以及服务器的位置。默认的InitialContext构造函数仅在存在系统属性时才有用,但属性与手动传递它们的属性相同。

至于您需要设置哪些属性,这取决于您的服务器。您需要搜索这些设置并将其插入。

答案 1 :(得分:10)

是JNDI问题。如果InitialContext类既没有JNDI服务提供者的默认属性也没有显式配置的服务器属性,您将看到该异常。

Context.INITIAL_CONTEXT_FACTORY environment属性设置为您正在使用的初始上下文实现的类名。此类必须可用于类路径中的程序。

检查:

答案 2 :(得分:10)

您需要将以下名称/值对放入哈希表中并调用此构造函数:

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

答案 3 :(得分:10)

您应该设置jndi.properties。我在下面给出了一些解释如何为activemq设置属性的代码。就像你可以为你的应用程序设置。在像JBoss这样的J2EE容器中,不需要设置这些属性。

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

我知道这是一个迟到的答案,但只是给将来参考。

答案 4 :(得分:6)

具体来说,我在SpringBoot中尝试检索嵌入式Tomcat7实例中的默认(无参数)InitialContext时遇到此问题。

我的解决方案是告诉Tomcat enableNaming

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    return new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            tomcat.enableNaming();
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }
    };
}

答案 5 :(得分:4)

简单&amp;可配置的解决方案是创建一个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

只需指定您的命名工厂&amp; url并将此文件放在类路径中。 JMS将自行获取所需信息,并且将来也可以轻松配置。

答案 6 :(得分:2)

大多数情况下,这些设置也在jndi.properties文件中定义。你有那个躺在某个地方吗?

答案 7 :(得分:2)

我通过在我的项目中添加以下Jar库解决了同样的问题:

  • 的appserv-rt.jar中
  • javaee.jar

来自文件夹:C:\Program Files\glassfish-4.0\glassfish\lib

这些图书馆的链接被破坏,Netbeans没有找到合适的课程。

答案 8 :(得分:1)

我的问题是我正在创建一个hibernate会话,但由于类路径问题而导致我的数据库实例的JNDI设置错误。仅供参考......

答案 9 :(得分:0)

确保包含jetty命名和jetty plus的依赖项(不仅仅是提供的范围)。 这为我修好了。

答案 10 :(得分:0)

这样做:

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 相应地调整路径

答案 11 :(得分:0)

你需要在你的客户端项目中使用jboss-client.jar,你需要在你的ejb项目中使用jnp-client jar