同様の質問が以前に尋ねられていますが、それらのすべてを通過しましたが問題を解決できませんでした。関連の質問 - Q1、Q2、Q3、Q4、Q5、Q6SpringBoot 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>
私は理由についてはわかりません。おそらく、彼らはプロパティファイルにユーザ名とパスワードを必要としません。私が気に入っているのは、春の起動はstarcat POMの一部としてtomcat-dbcp依存関係を含まず、デフォルトの工場としてDBCP DataSourceファクトリを使用していることです。 –
非組み込み環境にも展開できるようにする必要がある場合は、DB接続情報を保護するためのより良い方法はありますか?クラスファイルを介して直面する課題の1つは、さまざまなステージング環境でDBのURLとユーザーを編集することですが、db情報をwarファイルで配布することは良い考えではありません。 –
ファイルに含める必要はありません。アプリケーションの起動時や環境変数として引数として渡すことができます。また、データソースのjndi名を指定すると、ローカルで設定されたインスタンスの代わりに使用されます。あなたの方法をハッキングするのではなく、Springブートがどのようにプロパティファイルをロード/解決するか、そして環境のプロパティをどのように指定するかについて読むことをお勧めします。要するに、フレームワークではなく、フレームワークで作業する必要があります。 –