2016-09-02 9 views
2

同様の質問が以前に尋ねられていますが、それらのすべてを通過しましたが問題を解決できませんでした。関連の質問 - Q1Q2Q3Q4Q5Q6SpringBoot JNDIデータソースはjava.lang.ClassNotFoundExceptionをスローします:org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory

私は春ブーツと春のバッチプロジェクトを持っており、DB接続プールを使用しようとしています。私はバージョン8.5.xで埋め込みのtomcatコンテナを使用しています。

application.propertiesを使用してデータソースとプールの設定を指定すると、すべてうまく動作します。私はすべての新しい依存性または必要性を含める必要がある場合はわからないので、私はすべてのjarファイル名にMavenの瓶でtomcat-dbcp-**が表示されていない

Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory 

-

しかし、私はJNDIを使用しようとすると、私は例外を取得デフォルトのデータソースファクトリを設定し、どのようにそれを行うかについて説明します。

以下は、私のJNDI Beanの設定です。Questionです。私は特定の価値を消してしまった。

@Bean 
    public TomcatEmbeddedServletContainerFactory embeddedServletContainerFactory(){ 
     return new TomcatEmbeddedServletContainerFactory() { 

      @Override 
      protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
        Tomcat tomcat) { 
       tomcat.enableNaming(); 
       return super.getTomcatEmbeddedServletContainer(tomcat); 
      } 

      @Override 
      protected void postProcessContext(Context context) { 
       ContextResource resource = new ContextResource(); 
       resource.setName("jdbc/myDataSource"); 
       resource.setType(DataSource.class.getName()); 
       resource.setProperty("driverClassName", "com.ibm.db2.jcc.DB2Driver"); 
       resource.setProperty("url", "url"); 
       resource.setProperty("username", "user"); 
       resource.setProperty("password", "*****"); 
       context.getNamingResources().addResource(resource); 
      } 
     }; 
    } 

    @Lazy 
    @Bean(destroyMethod="") 
    public DataSource jndiDataSource() throws IllegalArgumentException, NamingException { 
     JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 
     bean.setJndiName("java:comp/env/jdbc/myDataSource"); 
     bean.setProxyInterface(DataSource.class); 
     bean.setLookupOnStartup(false); 
     bean.afterPropertiesSet(); 
     return (DataSource)bean.getObject(); 
    } 

私のpom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <packaging>war</packaging> 

    <groupId>***</groupId> 
    <artifactId>***</artifactId> 
    <version>1.0.0</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.0.RELEASE</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-batch</artifactId> 
      <exclusions> 
       <exclusion> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-log4j</artifactId> 
      <version>1.2.1.RELEASE</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-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>db2</groupId> 
      <artifactId>db2jcc</artifactId> 
      <version>4.0</version> 
     </dependency> 

     <dependency> 
      <groupId>db2</groupId> 
      <artifactId>db2jcc_license_cu</artifactId> 
      <version>4.0</version> 
     </dependency> 
    </dependencies> 

    <build> 

     <plugins> 

      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <version>1.4.0.RELEASE</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>repackage</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
+0

私は理由についてはわかりません。おそらく、彼らはプロパティファイルにユーザ名とパスワードを必要としません。私が気に入っているのは、春の起動はstarcat POMの一部としてtomcat-dbcp依存関係を含まず、デフォルトの工場としてDBCP DataSourceファクトリを使用していることです。 –

+0

非組み込み環境にも展開できるようにする必要がある場合は、DB接続情報を保護するためのより良い方法はありますか?クラスファイルを介して直面する課題の1つは、さまざまなステージング環境でDBのURLとユーザーを編集することですが、db情報をwarファイルで配布することは良い考えではありません。 –

+1

ファイルに含める必要はありません。アプリケーションの起動時や環境変数として引数として渡すことができます。また、データソースのjndi名を指定すると、ローカルで設定されたインスタンスの代わりに使用されます。あなたの方法をハッキングするのではなく、Springブートがどのようにプロパティファイルをロード/解決するか、そして環境のプロパティをどのように指定するかについて読むことをお勧めします。要するに、フレームワークではなく、フレームワークで作業する必要があります。 –

答えて

6

Resourcefactory属性を設定して問題を解決しました。自動的にDBCP工場とそのクラスにデフォルトをDataSourceタイプを見て、DBプールファクトリの型を推論し、何とかすることになっているresource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); Tomcatのあたり8ドキュメントとして

@Bean 
public TomcatEmbeddedServletContainerFactory embeddedServletContainerFactory(){ 
    return new TomcatEmbeddedServletContainerFactory() { 

     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      tomcat.enableNaming(); 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 

     @Override 
     protected void postProcessContext(Context context) { 
      ContextResource resource = new ContextResource(); 
      resource.setName("jdbc/myDataSource"); 
      resource.setType(DataSource.class.getName()); 
      resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); 
      resource.setProperty("driverClassName", "com.ibm.db2.jcc.DB2Driver"); 
      resource.setProperty("url", "url"); 
      resource.setProperty("username", "user"); 
      resource.setProperty("password", "*****"); 
      context.getNamingResources().addResource(resource); 
     } 
    }; 
} 

は、私のクラスパスにありません。

私はおそらくtomcat-dbcp-**ジャーを利用できるようにすることで問題を解決できると思いますが、私は春のブートでそれを行う方法や春のブートで可能であってもわかりません。

私が気付いたのは、Starter POMの一部としてtomcat-dbcp依存関係を含まず、デフォルト工場としてDBCP DataSourceファクトリを使用しているSpringブートです。

1

あなた は/ etc Tomcatの/突堤を使用している場合は、「スターターPOM」はもはや、JNDI relteadの依存関係が含まれては... JNDIであなたが今する必要があります。直接この依存関係を追加してください。

次に、あなたのapplication.propertiesにJNDIを設定するには、あなたの例外について spring.datasource.jndi-name=java:comp/env/jdbc/yourname

ファイル、あなたのpom.xmlファイルにtomcat-dbcpを追加する必要があります。

しかし、spring-boot-startter-jdbcまたはspring-boot-startter-data-jpa 'starters'を使用すると、プロジェクトの依存関係を確認できます。 は自動的に "tomcat-jdbc"に依存します。

+0

**これらの** jndi relteadの依存関係は何ですか?また、私はbean定義で同じプロパティを設定していると思います。 –

+0

@SabirKhanアップデートをご覧ください。ありがとうございます。 –

関連する問題