将 JNDI 与 Spring 集成时出错
Posted
技术标签:
【中文标题】将 JNDI 与 Spring 集成时出错【英文标题】:Error upon integrating JNDI with Spring 【发布时间】:2011-09-26 21:28:24 【问题描述】:这是我在 Spring 中第一次尝试使用 JNDI,但在尝试创建 ApplicationContext 时出现以下异常:
ApplicationContext context = new ClassPathXmlApplicationContext("master-job.xml");
Spring配置文件如下:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="/jdbc/Eqpstatus"/>
<property name="resourceRef" value="true" />
</bean>
<bean id="masterDao" class="com.dao.MasterDao">
<property name="dataSource" ref="dataSource"/>
</bean>
在服务器上,我有 JNDI 名称所需的资源条目。
<Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver"
maxActive="10" maxIdle="2" maxWait="10000" name="jdbc/Eqpstatus"
password="xxxx" type="javax.sql.DataSource"
url="jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx) (PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx) (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xyz)))"
username="xxx"/>
我看到的错误是:
javax.naming.NameNotFoundException:名称 jdbc 未绑定在此上下文中非常感谢您作为 Spring-JNDI 集成的新手对此的任何意见。
【问题讨论】:
【参考方案1】:如果您使用的是 Tomcat,并且您的 Tomcat 配置一切正常;这应该足够了:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/dataSource" />
jdbc/dataSource
是您的 Tomcat 配置中定义的名称。
编辑:
我的错,忘了 jndi.properties;有两种可能:
在您的类路径中提供 jndi.properties 或 在<jee:jndi-lookup />
的<jee:jndi-environment/>
元素中设置值(参见reference)
java.naming.factory.initial
属性需要确定设置为 org.apache.naming.java.javaURLContextFactory
之类的值,可能还有其他一些值,例如:
java.naming.factory.url.pkgs=org.apache.naming
java.naming.factory.url.pkgs.prefixes=org.apache.naming
java.naming.provider.url=org.apache.naming
另见reference。
【讨论】:
javax.naming.NoInitialContextException: 需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中:java.naming.factory.initial 将jndiName属性更改为“/jdbc/Eqpstatus”并将resourceRef属性添加为true后,我现在看到的错误是- javax.naming.NameNotFoundException: Name jdbc is not bound in this Context跨度> jndiName 属性在哪个配置文件中?你能用你当前的配置文件编辑你的问题吗? Spring 和 Tomcat 也是如此 jndiName 在 Spring 配置文件中。已编辑我的问题。 如果你使用的是 Tomcat,你需要使用 java:comp/env/jdbc/Eqpstatus。你有 jndi.properties 吗?您是否也尝试过专用的 jee 架构?【参考方案2】:首先,我认为您应该使用专用标签而不是声明“JndiObjectFactoryBean”bean:
<!-- JNDI DataSource for J2EE environments -->
<jee:jndi-lookup id="dataSource" jndi-name="java:jdbc/rppsDS-PUB-PROTO" default-ref="localDataSource" />
<!-- local dataSource for JUnit integration tests -->
<bean id="localDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="$jdbc.driverClassName"/>
<property name="url" value="$jdbc.url"/>
<property name="username" value="$jdbc.username"/>
<property name="password" value="$jdbc.password"/>
<property name="maxActive" value="100"/>
<property name="maxWait" value="1000"/>
<property name="poolPreparedStatements" value="true"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
然后,您需要一个 jndi.properties 文件(可以直接在 JBoss 等应用服务器目录中),其内容类似于:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
【讨论】:
我正在使用 Tomcat 6 作为 Web 服务器,并且我在上面的 server.xml 中添加了条目,其中包括您在 localDataSource bean 中拥有的所有这些配置。 好吧,如果你使用Tomcat,你不需要这些jnp参数,你只需要在“GlobalNamingResources”中定义一个“Resource”。也许您正在尝试运行 JUnit 测试(不能使用 jndi 数据源)。顺便问一下,你确定这个数据源是一个有效的 jdbc 数据源吗?启动Tomcat时没有错误吗? 我不是在尝试运行应用程序,也不是 Junit 测试。数据源有效,启动Tomcat没有错误。 你没有尝试运行应用程序,也没有运行 JUnit 测试,所以你能解释一下你正在尝试什么会导致错误吗? 抱歉,打错了。我的意思是我正在尝试运行应用程序而不是 Junit 测试。以上是关于将 JNDI 与 Spring 集成时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring-boot 上将 Spring Batch 与 spring-batch-admin-manager 集成时出错