Java Spring引导和Tomcat未找到JNDI资源

Java Spring引导和Tomcat未找到JNDI资源,java,spring,tomcat,spring-boot,jndi,Java,Spring,Tomcat,Spring Boot,Jndi,我使用的是Spring Boot 1.4.2.RELEASE。我还使用了tomcat8.5.9(非嵌入式)和java8 在我的application.properties文件中,我可以使用以下方法手动配置数据源: spring.datasource.url = jdbc:as400://blahblah.... spring.datasource.username = myuser spring.datasource.password = password spring.datasource.d

我使用的是
Spring Boot 1.4.2.RELEASE
。我还使用了
tomcat8.5.9
(非嵌入式)和
java8

在我的
application.properties
文件中,我可以使用以下方法手动配置数据源:

spring.datasource.url = jdbc:as400://blahblah....
spring.datasource.username = myuser
spring.datasource.password = password
spring.datasource.driver-class-name=com.ibm.as400.access.AS400JDBCDriver
这个很好用。但是,我们使用Tomcat来承载我们的连接。在Tomcat中,我们有:

<GlobalNamingResources>
    <Resource name="jdbc/BLAH" ..... />
</GlobalNamingResources>
现在,我甚至无法构建应用程序。我得到以下例外情况:

o.s.w.c.s.GenericWebApplicationContext   : 
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': 
Unsatisfied dependency expressed through constructor parameter 0; 
nested exception is org.springframework.beans.factory.BeanCreationException: 

Error creating bean with name 'dataSource' defined in class path resource 
[org/springframework/boot/autoconfigure/jdbc/JndiDataSourceAutoConfiguration.class]: 

Bean instantiation via factory method failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [javax.sql.DataSource]: 

Factory method 'dataSource' threw exception; nested exception is 
org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: 

Failed to look up JNDI DataSource with name 'java:comp/env/jdbc/BLAH'; 

nested exception is javax.naming.NoInitialContextException: 
Need to specify class name in environment or system property, or as an applet parameter, 
or in an application resource file:  java.naming.factory.initial
NoInitialContextException
让我相信Spring Boot无法找到正在运行的Tomcat,因此它无法执行JNDI查找

请记住,使用Spring Boot 1.2.5.RELEASE时,同样的设置也适用于我们。我们有另一个应用程序,它使用1.2.5.RELEASE、Java7和Tomcat7,并且使用JNDI资源工作。但是使用最新的Spring引导,Java8和Tomcat8却没有

感谢您的帮助

my pom.xml中的一些片段:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
    <relativePath/>
</parent>
...
<dependencies>
    <dependency>
        <groupId>net.sf.jt400</groupId>
        <artifactId>jt400</artifactId>
        <version>6.7</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-spring-boot-starter</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    ....
</dependencies>
更新

我已经使用我们的
server.xml
中的
GlobalNamingResources
在Tomcat(外部)中创建了资源。 这适用于其他应用程序

更新2

忘了提到我在
src/main/webapp/META-INF/context.xml
文件中有以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink global="jdbc/BLAH"
                  name="jdbc/BLAH"
                  type="com.mchange.v2.c3p0.ComboPooledDataSource"/>
</Context>

更新3


另外,我想澄清一下问题发生在
maven包的
步骤中。

如果您是在独立的Tomcat(非嵌入式)上部署,我很确定您需要在Tomcat上定义JNDI资源,而不是在application.properties中,而是在server.xml中,如下所示:

<GlobalNamingResources>
    <Resource name="jdbc/serverdb" auth="Container" type="javax.sql.DataSource"
              maxTotal="5" maxIdle="5" maxWaitMillis="30000"
              validationQuery="select 1" testOnBorrow="true"
              username="$AUTH_DB_USER" password="$AUTH_DB_PASSWORD" driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://$AUTH_DB_HOST:5432/$AUTH_DB_NAME"/>
</GlobalNamingResources>


您是否尝试过使用前面的斜杠引用资源?(即java:/…)spring.datasource.jndi name=java:/comp/env/jdbc/BLAHSorry,我不明白你的意思。不。还是一样。我还尝试了
/jdbc/BLAH
jdbc/BLAH
,我已经做到了。我不是很清楚,但这就是我们通常使用的应用程序。我将进行更新,以反映我已经这样做了。我有两个提示,第一个提示是您可能需要context.xml中的ResourceLink,它引用server.xml中定义的全局资源。第二步是在JndiLocatorSupport.lookup中设置一个断点(我猜它是在引导中使用的),然后调试JNDI树。我已经有了上下文条目。我将标记我的问题以反映这一点。我也会尝试断点。我还没有使用引导war文件尝试JDNI,但是我有几个Tomcat 8应用程序可以与JNDI一起工作,但是在那里我自己创建了JndiDataSourceLookup来获取数据源。我们没有使用“java:comp/env/”作为前缀,但这是因为我们显式地设置了JndiDataSourceLookup.setResourceRef(true),因此它将作为前缀-默认值为false,因此您可能需要设置它您有任何示例说明如何这样做吗?谢谢
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink global="jdbc/BLAH"
                  name="jdbc/BLAH"
                  type="com.mchange.v2.c3p0.ComboPooledDataSource"/>
</Context>
<GlobalNamingResources>
    <Resource name="jdbc/serverdb" auth="Container" type="javax.sql.DataSource"
              maxTotal="5" maxIdle="5" maxWaitMillis="30000"
              validationQuery="select 1" testOnBorrow="true"
              username="$AUTH_DB_USER" password="$AUTH_DB_PASSWORD" driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://$AUTH_DB_HOST:5432/$AUTH_DB_NAME"/>
</GlobalNamingResources>