2009-10-06 25 views
42

我寫我的EJB客戶端,並試圖執行它時,我得到以下異常:NoInitialContextException錯誤

javax.naming.NoInitialContextException: 需要 環境或系統屬性指定的類名,或者作爲小程序參數 ,或者應用程序資源文件 。

我只是不明白是什麼問題。

+0

如果你是新的J2EE檢查JNDI部分http://java.sun.com/docs/books/tutorial/ – JuanZe 2009-10-06 13:16:54

+0

在我有它是一個愚蠢的,請參閱http://stackoverflow.com/questions/6293052/hibernate -javax -naming -noinitialcontextexception-component-mapping-via-annotat – alfonx 2013-05-29 21:24:05

+1

https://docs.oracle.com/javase/tutorial/jndi/ops/faq.html#1 – 2015-11-20 13:24:47

回答

9

是一個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(運行時的問題)

+0

thx爲指針,我該如何解決它?我是這個J2EE新手的新手。 – Attilah 2009-10-06 13:12:07

+0

這不是一個快速回答的問題。取決於你的應用服務器的東西。我建議你檢查你正在使用的應用程序服務器的文檔,並嘗試在你的平臺上運行一個Hello World EJB應用程序,以獲得對該主題的更深入的理解。 – JuanZe 2009-10-06 13:23:12

9

你需要把下面的名稱/值對的一個哈希表,並調用這個構造器:

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 
27

javax.naming包中包含JNDI API。由於它只是一個API,而不是一個實現,所以您需要告訴它要使用哪個JNDI實現。這些實現通常特定於您要與之通話的服務器。

要指定一個實現,當您構造InitialContext時,將傳入一個Properties對象。這些屬性指定要使用的實現以及服務器的位置。默認的InitialContext構造函數僅在系統屬性存在時纔有用,但是這些屬性與您手動傳遞它們的屬性相同。

至於你需要設置哪些屬性,取決於你的服務器。您需要搜索這些設置並將其插入。

1

大多數情況下這些設置也在jndi.properties文件中定義。你有那個躺在某個地方嗎?

1

我這個問題是我創建了一個hibernate會話,但由於類路徑問題導致我的數據庫實例的JNDI設置錯誤。只是FYI ...

0

確保包括碼頭命名和jetty plus的相關性(不僅僅是提供的範圍)。 這給我修好了。

7

您應該設置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"); 

我知道這是一個遲到的答案,但只是給未來的參考。

1

我通過添加以下JAR庫到我的項目解決了同樣的問題:

  • 的appserv-rt.jar的
  • javaee.jar

從文件夾中:C:\Program Files\glassfish-4.0\glassfish\lib

這些庫的鏈接被打破,Netbeans沒有找到正確的類。

2

簡單&可配置的解決方案是創建一個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將自己獲取所需的信息,並且在將來也可以輕鬆配置。

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 調整路徑相應

4

具體來說,我試圖檢索默認情況下(這個問題沒有參數)InitialContext在SpringBoot中的嵌入式Tomcat7實例中。

對我來說,解決方案是告訴Tomcat enableNaming

@Bean 
public TomcatEmbeddedServletContainerFactory tomcatFactory() { 
    return new TomcatEmbeddedServletContainerFactory() { 
     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      tomcat.enableNaming(); 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 
    }; 
} 
0

你需要在你的客戶項目中使用的jboss-client.jar中,你需要使用JNP客戶端罐子在EJB項目