76

我正在为我的 EJB 编写一个客户端,在尝试执行它时,出现以下异常:

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

我只是不明白问题是什么。

4

12 回答 12

36

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

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

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

于 2010-01-01T17:33:39.587 回答
15

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

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

于 2013-11-18T07:38:16.467 回答
14

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

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
于 2009-12-31T16:29:54.793 回答
11

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

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

查看:

于 2009-10-06T13:06:48.367 回答
9

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

对我来说,解决方案是告诉 Tomcat 到enableNaming.

IE

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
    return new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            tomcat.enableNaming();
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }
    };
}
于 2016-05-05T02:04:21.137 回答
5

简单且可配置的解决方案是创建一个 jndi.properties 文件并将此文件放在类路径中。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 将自行获取所需的信息,并且将来也很容易配置。

于 2015-08-11T10:06:28.070 回答
2

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

  • appserv-rt.jar
  • javaee.jar

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

这些库的链接已损坏,Netbeans 没有找到要使用的正确类。

于 2014-04-30T13:36:17.550 回答
2

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

于 2010-08-11T15:28:12.277 回答
1

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

于 2011-10-27T17:47:25.337 回答
1

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

于 2016-09-07T11:00:18.107 回答
0

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

于 2013-08-01T18:01:34.140 回答
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 相应地调整路径

于 2015-09-14T15:01:21.477 回答