LoginSignup
1
2

More than 5 years have passed since last update.

Log4JDBCをSpring JDBCに設定する際、バージョンによるエラーでハマった際のメモ

Last updated at Posted at 2015-10-25

目的

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のログが表示されるようになった。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2