spring jndi 数据源设置

Posted

技术标签:

【中文标题】spring jndi 数据源设置【英文标题】:spring jndi datasource setup 【发布时间】:2013-05-04 05:21:19 【问题描述】:

您好,我正在尝试使用 jndi 数据源。下面是代码

context.xml

    <Context antiJARLocking="true" path="/SpringMVCTest">
     <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" 
            maxActive="20" maxIdle="10" maxWait="10000" 
            name="jdbc/pluto" password="" 
            type="javax.sql.DataSource" 
            url="jdbc:mysql://localhost:3306/spring?zeroDateTimeBehavior=convertToNull" 
            username="pluto"/>
</Context>

在 spring-servlet 配置 bean 中是:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jdbc/pluto" value="java:comp/env/jdbc/pluto"/>
        </bean>

我收到了这个错误

org.springframework.beans.factory.BeanCreationException: 错误 创建名为“contactController”的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire 字段:私有 app.contact.service.ContactService app.contact.controller.ContactController.contactService;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建名为“contactServiceImpl”的 bean 时出错:注入 自动装配依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire 字段:私有 app.contact.dao.ContactDAO app.contact.service.ContactServiceImpl.contactDAO;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为 'contactDAOImpl' 的 bean:注入 autowired 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 org.hibernate.SessionFactory app.contact.dao.ContactDAOImpl.sessionFactory;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建 ServletContext 中定义的名称为“sessionFactory”的 bean 资源 [/WEB-INF/spring-servlet.xml]:无法解析对 bean 'dataSource' 同时设置 bean 属性 'dataSource';嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建 ServletContext 中定义的名称为“dataSource”的 bean 时出错 资源 [/WEB-INF/spring-servlet.xml]:设置属性值时出错; 嵌套异常是 org.springframework.beans.NotWritablePropertyException:无效 bean 类的属性“jdbc/pluto” [org.springframework.jndi.JndiObjectFactoryBean]:Bean属性 'jdbc/pluto' 不可写或设置方法无效。是否 setter 的参数类型是否匹配 getter 的返回类型? 相关原因: org.springframework.beans.factory.BeanCreationException:错误 创建 ServletContext 中定义的名称为“dataSource”的 bean 资源 [/WEB-INF/spring-servlet.xml]:设置属性值时出错; 嵌套异常是 org.springframework.beans.NotWritablePropertyException:无效 bean 类的属性“jdbc/pluto” [org.springframework.jndi.JndiObjectFactoryBean]:Bean属性 'jdbc/pluto' 不可写或设置方法无效。是否 setter的参数类型和getter的返回类型是否匹配?

【问题讨论】:

字段不能有名称jdbc/pluto 【参考方案1】:

你有一个这样的 bean 定义

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jdbc/pluto" value="java:comp/env/jdbc/pluto"/>
</bean>

属性名称jdbc/pluto 应该与setter 匹配,因此Spring 需要setJdbc/Pluto() 之类的名称,但这显然不是正确的Java 语法。

查看JndiObjectFactoryBean,您似乎想要来自JndiObjectLocator 超类的setJndiName() 方法。

所以你的 bean 应该看起来像

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/pluto"/>
</bean>

【讨论】:

以上是关于spring jndi 数据源设置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 测试模拟的 JNDI 数据源?

spring 找不到 JNDI 数据源

JNDI在Spring和tomcat下的使用

Spring Boot - 外部 Tomcat - JNDI 数据源

在 Spring Boot 应用程序中查找 JNDI 数据源失败

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