无法在Spring Boot应用程序中查找JNDI DataSource

时间:2017-02-07 22:04:33

标签: spring tomcat jdbc spring-boot jndi

我已经为使用外部tomcat的Spring Boot Application的JNDI DataSource连接做了下面提到的配置。

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 DataSource   &#39;的java:comp / env的/ JDBC / MyPostgres&#39;

(完全Stacktrace没有给出每个给定的位置)

那么解决方案是什么或为什么我得到这个例外。

不要为嵌入式tomcat服务器提供弹簧启动的想法。 请帮帮我。

2 个答案:

答案 0 :(得分:1)

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

如需精心解答,请参阅here

答案 1 :(得分:-1)

应该是

  

spring.datasource.jndi名=的java:comp / env的/ JDBC / MyPostgres的 DB

来自您在定义中的上述内容。