将 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 或 在&lt;jee:jndi-lookup /&gt;&lt;jee:jndi-environment/&gt; 元素中设置值(参见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 数据源绑定到 JNDI

在 Spring-boot 上将 Spring Batch 与 spring-batch-admin-manager 集成时出错

spring与mybatis集成

spring与mybatis集成

无法将 GWT 与 Spring RestTemplate 实现集成

将 jndi 数据源与 spring 批处理管理一起使用