JNDI 与 spring mvc3 集成

Posted

技术标签:

【中文标题】JNDI 与 spring mvc3 集成【英文标题】:JNDI with spring mvc3 integration 【发布时间】:2012-04-26 10:13:08 【问题描述】:

我正在使用 Spring MVC 3 和 mysql 服务器。我正在尝试将 JNDI 用于 JDBC 连接,但它返回 NULL 数据源。这是抛出空指针异常的一段代码。

server.xml 文件包含:

  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
  </GlobalNamingResources>

context.xml文件内容

    <Resource name="jdbc/Test" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           username="root" password="123456" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/test"/>

web.xml文件目录:

     <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/Test</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>

despatcher-servlet.xml文件:

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

    <bean name="dbConfiguration" class="com.biztree.springtest.database.DataBaseConfiguration" >
        <property name="dataSource" ref="myDataSourceInJndi" />
    </bean>

DataBaseConfiguration.java

package com.biztree.springtest.database;

import javax.sql.DataSource;

public class DataBaseConfiguration 

    DataSource dataSource;

    public DataBaseConfiguration() 
        // TODO Auto-generated constructor stub
    

    public void setDataSource(DataSource dataSource) 
        this.dataSource = dataSource;
    

    public DataSource getDataSource() 
        return dataSource;
    

听到是连接代码

          /*    this code work throw NullPointerException */
        try 

            DataBaseConfiguration baseConfiguration = new DataBaseConfiguration();
            DataSource ds = baseConfiguration.getDataSource();
            System.out.println("ds Object : " + ds);
            connection = ds.getConnection();
         catch (Exception exception) 
            exception.printStackTrace();
        

ds 为空。

如果我使用以下代码而不是正常工作

          /*    this code work fine */
        try 
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            DataSource ds = (DataSource)  envCtx.lookup("jdbc/Test");

            System.out.println("ds Object : " + ds);
            connection = ds.getConnection();
         catch (Exception exception) 
            exception.printStackTrace();
        

【问题讨论】:

您的数据源的&lt;Resource&gt; 元素在哪里?见tomcat.apache.org/tomcat-6.0-doc/… 元素在 server.xml 的 对不起 axtavt,我忘了在 context.xml 中写出我的资源有问题的 元素 【参考方案1】:

您需要为 spring 启用调试日志记录,和/或调试 spring 以查看它实际查找的内容,并将其与您的直接 JNDI 代码正在执行的操作进行比较。

这样的事情也会让你失望:

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jndi/JndiLocatorSupport.html#setResourceRef(boolean)

(你在 JndiObjectFactoryBean 上设置了这个属性,它会自动添加 comp/env 部分...检查默认值是什么并确保它设置正确)

无论如何,一旦你调试 spring 看看它在做什么,你就可以确认。

【讨论】:

以上是关于JNDI 与 spring mvc3 集成的主要内容,如果未能解决你的问题,请参考以下文章

将 Spring 数据源绑定到 JNDI

spring与mybatis集成

spring与mybatis集成

7spring集成hibernate

无法将 GWT 与 Spring RestTemplate 实现集成

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