我寫我的EJB客戶端,並試圖執行它時,我得到以下異常:NoInitialContextException錯誤
javax.naming.NoInitialContextException: 需要 環境或系統屬性指定的類名,或者作爲小程序參數 ,或者應用程序資源文件 。
我只是不明白是什麼問題。
我寫我的EJB客戶端,並試圖執行它時,我得到以下異常:NoInitialContextException錯誤
javax.naming.NoInitialContextException: 需要 環境或系統屬性指定的類名,或者作爲小程序參數 ,或者應用程序資源文件 。
我只是不明白是什麼問題。
是一個JNDI問題。如果InitialContext類既沒有JNDI服務提供程序的默認屬性,也沒有顯式配置服務器屬性,您將看到該異常。
將Context.INITIAL_CONTEXT_FACTORY環境屬性設置爲您正在使用的初始上下文實現的類名稱。該類必須可用於類路徑中的程序。
檢查:
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
javax.naming
包中包含JNDI API。由於它只是一個API,而不是一個實現,所以您需要告訴它要使用哪個JNDI實現。這些實現通常特定於您要與之通話的服務器。
要指定一個實現,當您構造InitialContext
時,將傳入一個Properties
對象。這些屬性指定要使用的實現以及服務器的位置。默認的InitialContext
構造函數僅在系統屬性存在時纔有用,但是這些屬性與您手動傳遞它們的屬性相同。
至於你需要設置哪些屬性,取決於你的服務器。您需要搜索這些設置並將其插入。
大多數情況下這些設置也在jndi.properties
文件中定義。你有那個躺在某個地方嗎?
我這個問題是我創建了一個hibernate會話,但由於類路徑問題導致我的數據庫實例的JNDI設置錯誤。只是FYI ...
確保包括碼頭命名和jetty plus的相關性(不僅僅是提供的範圍)。 這給我修好了。
您應該設置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");
我知道這是一個遲到的答案,但只是給未來的參考。
我通過添加以下JAR庫到我的項目解決了同樣的問題:
從文件夾中:C:\Program Files\glassfish-4.0\glassfish\lib
這些庫的鏈接被打破,Netbeans沒有找到正確的類。
簡單&可配置的解決方案是創建一個jndi.properties文件並將該文件放在classpath中。 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將自己獲取所需的信息,並且在將來也可以輕鬆配置。
這樣做:
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
調整路徑相應
具體來說,我試圖檢索默認情況下(這個問題沒有參數)InitialContext
在SpringBoot中的嵌入式Tomcat7實例中。
對我來說,解決方案是告訴Tomcat enableNaming
。
即
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
你需要在你的客戶項目中使用的jboss-client.jar中,你需要使用JNP客戶端罐子在EJB項目
如果你是新的J2EE檢查JNDI部分http://java.sun.com/docs/books/tutorial/ – JuanZe 2009-10-06 13:16:54
在我有它是一個愚蠢的,請參閱http://stackoverflow.com/questions/6293052/hibernate -javax -naming -noinitialcontextexception-component-mapping-via-annotat –
alfonx
2013-05-29 21:24:05
https://docs.oracle.com/javase/tutorial/jndi/ops/faq.html#1 – 2015-11-20 13:24:47