Spring Jndi配置,Server.xml

blo*_*824 6 java configuration spring 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>
Run Code Online (Sandbox Code Playgroud)

我在我的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>
Run Code Online (Sandbox Code Playgroud)

然后我在文件中有这个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>
Run Code Online (Sandbox Code Playgroud)

我的服务器启动时没有错误.

当我尝试运行以下测试时(在我添加JNDI代码之前有效):

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

我收到以下错误:

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

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

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

lim*_*imc 11

运行测试用例时,您将需要使用JDBC而不是JNDI查找.原因很简单,因为您通常不会从应用程序服务器运行测试用例.因此,JNDI查找将失败.

我的目的是将数据源放在一个单独的文件中.我有一个使用JNDI的生产文件: -

项目datasource.xml

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool"></jee:jndi-lookup>
Run Code Online (Sandbox Code Playgroud)

...另一个使用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>
Run Code Online (Sandbox Code Playgroud)

Web应用程序将使用project-datasource.xml,而单元测试将使用project-datasource-test.xml.