2017-01-06 5 views
3

私はSpring Boot 1.4.2.RELEASEを使用しています。私はTomcat 8.5.9(埋込みされていない)とJava 8も使用しています。私application.propertiesファイルでSpringブートとTomcatがJNDIリソースを見つけられない

、私は手動で使用して私のデータソースを設定することができます。

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> 

だから私は、その後にapplication.propertiesを変更:今すぐ

spring.datasource.jndi-name=java:comp/env/jdbc/BLAH 
spring.jpa.database-platform=org.hibernate.dialect.DB2400Dialect 
spring.jpa.show-sql=true 

、私もアプリケーションを構築することはできません。私は、次の例外を取得:

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は春ブーツは、それがJNDIルックアップを実行することはできませんので、Tomcatが動作して見つけることができないと信じて私をリードしています。

正確なは、Springブート1.2.5.RELEASEを使用して同じセットアップが行われました。 1.2.5.RELEASE、Java 7、Tomcat 7を使用する別のアプリケーションがあり、JNDIリソースを使用して動作します。しかし、最新のSpring Bootを使用すると、Java 8とTomcat 8はそうではありません。

何か助けていただければ幸いです。

私の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> 

その他のコードスニペット:

@SpringBootApplication 
public class MyApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(MyApplication.class, args); 
    } 
} 


@SpringBootConfiguration 
@EnableAutoConfiguration 
@ComponentScan(basePackages = "com.company.myapp") 
@EnableJpaRepositories(basePackages = "com.company.myapp.repository") 
@EnableTransactionManagement 
@EnableVaadin 
@EnableVaadinServlet 
public class AppConfiguration { 
} 

UPDATE

私が使用してTomcatの(外部)内のリソースを作成しましたGlobalNamingResourcesserver.xmlです。 これは他のアプリケーションでも機能します。また、私はそれが問題をクリアしたい

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

UPDATE 3

UPDATE 2

は、私がsrc/main/webapp/META-INF/context.xmlファイルに次のしていることを言及し忘れましたmaven packageのステップで発生します。

+0

先行するスラッシュでリソースを参照しようとしましたか? (つまりjava:/ ...)spring.datasource.jndi-name = java:/ comp/env/jdbc/BLAH –

+0

申し訳ありませんが、私はあなたの言っていることに従いません。 – cbmeeks

+0

まだ同じ。私は '/ jdbc/BLAH'と' jdbc/BLAH'も試しました。 – cbmeeks

答えて

0

スタンドアロンの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> 
+0

私はそれをしました。私はそれほど明確ではありませんでしたが、それは私たちが通常どおりにアプリをやっていることです私はそれをしたことを反映するように更新します。 – cbmeeks

+0

2つのヒントがあります。最初に、server.xmlで定義されたグローバルリソースを参照するcontext.xmlにResourceLinkが必要な場合があります。 2番目のステップは、JndiLocatorSupport.lookupにブレークポイントを設定することです(これはBootで使用されていると思います)、JNDIツリーをデバッグします。 –

+0

ヒントをありがとう。私はすでにコンテキストエントリを持っています。私はそれを反映するために私の質問に印をつけます。私はブレークポイントも試みます。 – cbmeeks

関連する問題