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

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中查找 JNDI 数据源失败【英文标题】:Failed to look up JNDI DataSource In Spring Boot Application 【发布时间】:2017-02-07 22:04:32 【问题描述】:

我已经为使用外部 tomcat 的 Spring Boot 应用程序的 JNDI 数据源连接完成了下面提到的配置。

Tomcat 的 server.xml 配置类似

         <GlobalNamingResources>
            <!-- Editable user database that can also be used by
                 UserDatabaseRealm to authenticate users
            -->

            <Resource name="jdbc/MyPostgresDB" 
              global="jdbc/MyPostgresDB" 
              auth="Container" 
              type="javax.sql.DataSource" 
              driverClassName="org.postgresql.Driver" 
              url="jdbc:postgresql://localhost:5432/postgres" 
              username="postgres" 
              password="postgres" 

              maxActive="100" 
              maxIdle="20" 
              minIdle="5" 
              maxWait="10000"/>

Context.xml 之类的

        <Context>

            <!-- Default set of monitored resources -->
            <WatchedResource>WEB-INF/web.xml</WatchedResource>

            <ResourceLink name="jdbc/MyPostgresDB"
                        global="jdbc/MyPostgresDB”
                        auth="Container"
                        type="javax.sql.DataSource" />

以正确的方式为spring boot定义了application.properties

spring.datasource.jndi-name=java:comp/env/jdbc/MyPostgres

更新了 web.xml 之类的

        <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

    <resource-ref>
        <description>JNDI LookUp</description>
        <res-ref-name>jdbc/MyPostgresDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <!-- <res-sharing-scope>Shareable</res-sharing-scope> -->
    </resource-ref>

    </web-app>

仍然得到像

这样的异常

org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: 使用名称查找 JNDI 数据源失败 'java:comp/env/jdbc/MyPostgres'

(没有给出完整的堆栈跟踪)

那么解决方案是什么或为什么我会收到此异常。

别想着用嵌入式tomcat服务器来做spring boot。 请帮帮我。

【问题讨论】:

以正确的方式为 spring boot 定义了 application.properties,如 spring.datasource.jndi-name=java:comp/env/jdbc/MyPostgresDB 仍然出现异常(在原始帖子中是拼写错误抱歉) 【参考方案1】:

应该是

spring.datasource.jndi-name=java:comp/env/jdbc/MyPostgresDB

根据您在上面的定义中所写的内容。

【讨论】:

抱歉,和你说的完全一样,我发错了,但还是报错 在尝试回答更多问题之前,请阅读How do I write a good answer?。【参考方案2】:

我们应该在 server.xml 的 Resource 标签中添加 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 并确保在扩展 SpringBootServletInitializer 类的类中设置 JndiDatasource

详细答案请参考here

【讨论】:

链接不存在

以上是关于在 Spring Boot 应用程序中查找 JNDI 数据源失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot Mongodb 中使用聚合框架按计数查找组

Mongodb 查找各组中最新的并在 Spring boot 中实现

Spring Boot - JPA 或 SQL 查询在连接表中查找最常见的项目?

Swagger (Springfox) 仅查找 Controller @RequestBody (Spring Boot) 中使用的模型

spring boot 静态资源的映射规则 欢迎页面映射

Spring Boot配置文件规则以及使用方法官方文档查找以及Spring项目的官方文档查找方法