2011-03-04 61 views
6

我有一個問題,春節建立我的配置JNDI。我查了其他帖子,但無法解決我的問題。我使用Tomcat 6作爲我的容器。根據我的理解,我需要在服務器上設置資源。所以在我的server.xml文件我有這樣的:春JNDI配置,server.xml中

<GlobalNamingResources> 
    <Resource auth="Container" driverClassName="org.postgresql.Driver" 
      maxActive="100" maxIdle="5" maxWait="10000" 
      minEvictableIdleTimeMillis="60000" name="jdbc/myTomcatPool" 
      password="password" testOnBorrow="true" testWhileIdle="true" 
      timeBetweenEvictionRunsMillis="10000" type="javax.sql.DataSource" 
      url="jdbc:postgresql://localhost:5432/postgis" username="postgres" 
      validationQuery="SELECT 1"/> 
</GlobalNamingResources> 

我已在效法我spring-context.xml(這是在classpath):

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool" /> 

<bean id="geoCodeService" class="com.sample.SampleImpl"> 
    <property name="dataSource" ref="geoCodeData"/> 
</bean> 

然後我有這個文件META-INF/context.xml

<Context path="/myApp" reloadable="true" cacheMaxSize="51200" 
     cacheObjectMaxSize="2560"> 
    <ResourceLink global="jdbc/myTomcatPool" name="jdbc/myTomcatPool" 
      type="javax.sql.DataSource"/> 
</Context> 

我的服務器啓動時沒有錯誤。

當我嘗試運行以下測試(即工作前,我加入了JNDI代碼):

public class Test { 
    public static void main(String[] args) { 
     ApplicationContext ctx = 
      new ClassPathXmlApplicationContext("spring-context.xml"); 
    } 
} 

我收到以下錯誤:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'geoCodeData': Invocation of init method failed;

nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

是我的配置錯誤,或在我試圖運行測試不正確?

回答

11

當你運行你的測試用例,你會想,而不是使用JNDI查找JDBC。原因很簡單,因爲您通常不會從應用程序服務器運行測試用例。因此,JNDI查找將失敗。

我對我到底什麼是將數據源中的一個單獨的文件。我有一個文件進行生產,它使用JNDI: -

項目datasource.xml

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool"></jee:jndi-lookup> 

...另一個另一文件的單元測試使用JDBC: -

項目 - 數據源-的test.xml

// use the same bean name "geoCodeData" 
<bean id="geoCodeData" class="..."> 
    <property name="driverClassName" value="..." /> 
    <property name="url" value="..." /> 
    <property name="username" value="..." /> 
    <property name="password" value="..." /> 
</bean> 

網絡應用程序將使用公關oject-datasource.xml,而單元測試將使用項目的數據源 - 的test.xml

+0

這很有道理。我認爲這可能與測試案例有關。我會試試這個。我將把這標記爲答案。再次感謝。最後一個問題,我會在我的web.xml中添加project-datasource.xml到contextConfigLocation的列表中,並在我的測試類中使用project-datasource-test.xml,就像我的例子一樣? – blong824 2011-03-04 19:22:46

+1

多聰明的解決方案!順便說一句,你可以使用:''等方式引用你的app config xml中新創建的數據源文件。乾杯! – acdcjunior 2013-12-04 20:46:00

3

幾個小時撕裂了我(已經稀疏)的頭髮後,我設法讓我的tomcat服務器池中的數據庫連接到Oracle和使用Spring框架。 我雖然會回答這個問題,即使似乎有答案,以防萬一它幫助其他人。

我想要的: 由Tomcat(而不是每個servlet)管理的連接池和Tomcat服務器配置中的數據庫連接配置(再次,而不是servlet配置文件)。

我們有幾個Tomcat實例,每個實例都連接到一個特定的Oracle DB,但是開發人員正在生產可能需要在其中任何一個上運行的servlet,因此我不希望WAR中的DB連接詳細信息它們生成的文件,但讓它們查看它並通過JNDI提供該服務器的數據源。

Tomcat服務器conf/context.xml我添加以下代碼:


<Resource  name="jdbc/banner" 
       auth="Container" 
      factory="org.apache.commons.dbcp.BasicDataSourceFactory" 
        type="javax.sql.DataSource" 
        driverClassName="oracle.jdbc.OracleDriver" 
        url="jdbc:oracle:thin:@DBan8DB1.example.ac.uk:1522:bde8" 
      username="dbsro" 
      password="verysecret" 
      initialSize="5" 
      maxActive="20" 
      maxIdle="10" 
      removeAbandoned="true" 
      global="jdbc/banner" 
      maxWait="-1"/> 

顯然我目前在Tomcat的lib服務器上的目錄ojdbc,游泳池和DBCP JAR文件。 這裏需要注意的一個重點是type"javax.sql.DataSource"而不是我原本認爲應該是的"org.apache.commons.dbcp.BasicDataSource"

現在在Web應用程序的WEB-INF/web.xml我增加了以下內容:


<resource-ref> 
     <description>Oracle Banner Datasource</description> 
     <res-ref-name>jdbc/banner</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 

,並在我的Web應用程序的servlet-context.xml文件(在任何你保持你的可能會發生變化)我有這個。這是不是整個文件,但XML命名空間是很重要的位置,爲JEE部分:


<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 


<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/banner" resource-ref="true" /> 

還是要注意完全限定引用jndi-name="java:comp/env/jdbc/banner"這似乎是必需的。爲什麼在web.xml文件的資源引用部分不需要,我不知道。

如果有人對此有任何想法,我會很樂意閱讀它們。

順便說一句,這個URL幫助:Tomcat6 JNDI data source how-to

之後所有的連接工作。於是我從我的工作臺擦去了血跡,汗水和淚水,並享用了一杯美味的新鮮咖啡。

+0

這幫了我很多! – 2014-11-11 16:32:39