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