NoInitialContextException错误

我正在为我的EJB编写一个客户端,并试图执行它,我得到以下exception:

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

我不明白是什么问题。

javax.naming包由JNDI API组成。 由于它只是一个API,而不是一个实现,所以您需要告诉它要使用哪个JNDI实现。 这些实现通常特定于您正在尝试与之通信的服务器。

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

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

你需要把下面的名字/值对放到一个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 

是一个JNDI问题。 如果InitialContext类既没有JNDI服务提供程序的默认属性,也没有显式configuration服务器属性,您将看到该exception。

将Context.INITIAL_CONTEXT_FACTORY环境属性​​设置为您正在使用的初始上下文实现的类名称。 该类必须可用于类path中的程序。

检查:

http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html

http://java.sun.com/products/jndi/tutorial/getStarted/TOC.html (运行时问题)

你应该设置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"); 

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

具体来说,当试图在SpringBoot中的embedded式Tomcat7实例中检索默认(无参数) InitialContext时,我遇到了这个问题。

对我来说,解决scheme是告诉Tomcat enableNaming

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

简单和可configuration的解决scheme是创build一个jndi.properties文件,并将该文件放在classpath中。 jndi.properties可以被创build为

 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,并把这个文件放在你的类path中。 JMS将自己获取所需的信息,并且将来也可以轻松configuration。

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

我的问题是,我正在创build一个hibernate会话,但由于类path问题,我的数据库实例的JNDI设置错误。 只是FYI …

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

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

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

这些库的链接被打破,Netbeans没有find正确的类。

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

做这个:

 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调整path

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