#目的
Log4JDBCを設定する際、org.springframework.bootのバージョンの相性が悪く
1.2.7.RELEASEでは、dataSourceが単一ではないという内容のエラーが発生
1.1.8.RELEASE へバージョンを変更したら解決した
#環境
フレームワーク Spring Boot 1.2.7.RELEASE -> Spring Boot 1.1.8.RELEASE
DB h2データベース
#手順
##pom.xmlの設定
log4jdbc-remixのdependencyを追記する
(略)----------
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
(略)----------
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
</dependencies>
(略)----------
</project>
##src/main/resources/logback.xmlの設定
Log4JDBCのログ出力の設定を、resourcesパッケージ直下へ配置する
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<logger name="jdbc" level="OFF" />
<logger name="jdbc.sqltiming" level="DEBUG" />
</configuration>
##AppConfigクラスの設定
Log4JDBCを利用するために、DataSourceを明示的に定義し、DIコンテナに登録する。
package com.example;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import net.sf.log4jdbc.Log4jdbcProxyDataSource;
@Configuration
public class AppConfig {
@Autowired
DataSourceProperties dataSourceProperties;
DataSource dataSource;
@Bean(destroyMethod = "close")
DataSource realDataSource(){
DataSourceBuilder factory = DataSourceBuilder
.create(this.dataSourceProperties.getClassLoader())
.url(this.dataSourceProperties.getUrl())
.username(this.dataSourceProperties.getUsername())
.password(this.dataSourceProperties.getPassword());
this.dataSource = factory.build();
return this.dataSource;
}
@Bean
DataSource dataSource(){
return new Log4jdbcProxyDataSource(this.dataSource);
}
}
##メインのクラスの修正
@ComponentScanを追記し、明示的に定義したBeanを読み込む
@EnableAutoConfiguration
@ComponentScan
public class FirstbootappApplication implements CommandLineRunner{
これで設定は完了、コンソールにDBのログが表示されるはずなのだが...
#問題
この状態で実行した際、異常終了が発生する
Beanのインジェクションに失敗したというエラーログが出る
その原因は、DataSourceが一つでなければならないのに2つ(dataSource、dataSourceProperties)ある
というエラーログ
#対処
pomに定義されていたSpringBootのバージョン
1.2.7.RELEASE
を
1.1.8.RELEASE
に変更したところ、ビルドがとおり、正常にDBのログが表示されるようになった。