Spring Jndi配置,Server.xml

时间:2011-03-04 17:35:31

标签: java spring configuration jndi

我在使用Spring设置JNDI配置时遇到问题。我检查了其他帖子,但无法解决我的问题。我使用Tomcat 6作为我的容器。根据我的理解,我需要在服务器上设置资源。所以在我的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(在类路径上)中有以下内容:

<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");
    }
}

我收到以下错误:

  

线程“main”中的异常org.springframework.beans.factory.BeanCreationException:创建名为'geoCodeData'的bean时出错:init方法的调用失败;

     

嵌套异常是javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或者在applet参数中或在应用程序资源文件中指定类名:java.naming.factory.initial

我的配置是错误的还是我尝试运行测试的方式不正确?

2 个答案:

答案 0 :(得分:11)

运行测试用例时,您将需要使用JDBC而不是JNDI查找。原因很简单,因为您通常不会从应用程序服务器运行测试用例。因此,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>

网络应用将使用 project-datasource.xml ,而单元测试将使用 project-datasource-test.xml

答案 1 :(得分:3)

经过几个小时的撕毁我已经稀疏的头发后,我设法让我的tomcat服务器将数据库连接池连接到Oracle并使用Spring框架。 我虽然似乎有答案,但我会回答这个问题,以防其他人帮助过。

我想要的: 由Tomcat(而不是每个servlet)管理的连接池和Tomcat服务器配置中的DB连接的配置(同样,而不是servlet配置文件)。

我们有几个Tomcat实例,每个实例都连接到一个特定的Oracle数据库,但开发人员正在生成可能需要在其中任何一个上运行的servlet,因此我不希望WAR文件中的数据库连接细节他们生产,但让他们通过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,pool和dbcp JAR文件。 这里需要注意的一点是type"javax.sql.DataSource"而不是"org.apache.commons.dbcp.BasicDataSource"我原本认为它应该是。{/ p>

现在,在 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文件的resource-ref部分不需要,我不知道。

如果有人对此有任何想法,我很乐意阅读它们。

顺便说一下,此网址有助于:Tomcat6 JNDI data source how-to

毕竟,连接工作正常。所以我擦掉了工作站的鲜血,汗水和眼泪,享用了一杯美味的新鲜咖啡。