我写我的EJB客户端,并试图执行它时,我得到以下异常:
javax.naming.NoInitialContextException
:需要环境或系统属性指定的类名,或者作为一个小程序参数,或应用程序的资源文件。
我只是不明白是什么问题。
我写我的EJB客户端,并试图执行它时,我得到以下异常:
javax.naming.NoInitialContextException
:需要环境或系统属性指定的类名,或者作为一个小程序参数,或应用程序的资源文件。
我只是不明白是什么问题。
所述javax.naming
包包括JNDI API。 由于它只是一个API,而不是一个实现,你需要告诉它使用哪一个实现JNDI的。 的实现通常是具体到你想交谈的服务器。
要指定的实现,你在传递Properties
,当你构造对象InitialContext
。 这些属性指定要使用的实施,以及服务器的位置。 默认InitialContext
时不存在系统属性的构造是唯一有用的,但性质是一样的,如果你在手动与他们擦肩而过。
至于你需要设置哪些属性,这取决于您的服务器上。 您需要向下寻找这些设置,并把它们插入。
是一个JNDI问题。 你会看到,但如果该InitialContext
类具有了JNDI服务提供商也不明确配置的服务器属性没有默认属性。
设置Context.INITIAL_CONTEXT_FACTORY
环境属性为您正在使用的初始上下文实现的类名。 这个类必须提供给你在classpath程序。
校验:
http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html
http://java.sun.com/products/jndi/tutorial/getStarted/TOC.html (运行时问题)
你需要把下面的名称/值对的一个哈希表,并调用此构造:
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.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");
我知道这是一个迟到的回答,而只是给人以备将来参考。
具体来说,我试图检索默认(无参数)时,这个问题InitialContext
嵌入式Tomcat7实例中,在SpringBoot。
对我来说,解决办法,就是告诉Tomcat来enableNaming
。
即
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
易和配置的解决方案是创建一个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
只要指定你的命名工厂和网址,并把这个文件在类路径中。 JMS本身将读取所需的信息,并在未来的很容易配置也。
大部分时间在也被定义这些设置jndi.properties
文件。 你有一个躺在附近的地方?
我通过添加以下JAR库到我的项目解决了同样的问题:
从文件夹: C:\Program Files\glassfish-4.0\glassfish\lib
这些库的链接被打破和Netbeans没有找到合适的类使用。
我的这一个问题是,我是创建一个Hibernate的Session,但有JNDI设置为我的数据库实例错误的,因为的类路径问题。 仅供参考...
作出码头命名和码头确保依赖性加上包括(不只是提供范围)。 这个固定为我。
做这个:
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
相应地调整路径
你需要在你的客户项目中使用的jboss-client.jar中,你需要使用JNP客户端罐子在EJB项目