Tomcat - 找不到Spring DataSource JNDI,但它存在

时间:2014-03-18 12:15:11

标签: java spring tomcat datasource jndi

我在使用tomcat JndiDataSourceLookup工作时遇到了一些问题 我克隆了一个tomcat,其中包含了从vm到另一个vm的所有配置和应用程序。 原始安装工作正常,但当我尝试启动新安装时,它无法说:

Caused by: javax.naming.NameNotFoundException: Name [jdbc/sipreDs] is not bound in this Context. Unable to find [jdbc].

所以我尝试进行一些调试并将我的工厂方法编写为:

@Bean
@SneakyThrows
public DataSource dataSource(){
    Context context = new InitialContext();
    NamingEnumeration<NameClassPair> names = context.list("java:comp/env/jdbc");
    System.out.println("========================================");
    System.out.println("           CONTEXT JNDI");
    System.out.println("========================================");
    while (names.hasMore()){
        NameClassPair name = names.next();
        System.out.println(name.getName());
    }
    System.out.println("=========================================");
    final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
    dsLookup.setResourceRef(true);
    return dsLookup.getDataSource("jdbc/sipreDs");
}

输出结果为:

========================================
       CONTEXT JNDI
========================================
sipreDs
=========================================

数据源在conf/context.xml文件中定义:

 <Resource name="jdbc/sipreDs" auth="Container" type="javax.sql.DataSource"
           maxActvive="100" maxIdle="30" maxWait="10000"
           username="sipre" password="sipre" driverClassName="org.gjt.mm.mysql.Driver"
           url="jdbc:mysql://localhost:3306/sipre"/>

为什么用普通的jndi打印数据源但使用spring会抛出异常?

1 个答案:

答案 0 :(得分:0)

尝试以下

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource) envCtx.lookup("jdbc/sipreDs");

您似乎在查找上下文和数据源

时使用了jdbc