NoInitialContextException错误的含义

2022-08-31 12:46:53

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

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

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


答案 1

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

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

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


答案 2

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

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


推荐