我在使用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
我的配置是错误的还是我尝试运行测试的方式不正确?
答案 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
毕竟,连接工作正常。所以我擦掉了工作站的鲜血,汗水和眼泪,享用了一杯美味的新鲜咖啡。