web-dev-qa-db-ja.com

スプリングブートでliquibaseのdataSourceを構成する

Spring Bootアプリケーションがあり、そのためにliquibase構成変更ログを追加したいと思います。

Liquibaseを設定するためのLiquibaseConfigクラスを作成しました:

@Configuration
public class LiquibaseConfiguration {

    @Value("${com.foo.bar.liquibase.changelog}")
    private String changelog;

    @Autowired
    MysqlDataSource dataSource;

    @Bean
    public SpringLiquibase liquibase()  {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSource);
        liquibase.setChangeLog(changelog);
        return liquibase;
    }

}

プロパティファイルでデータソース情報を構成しました:

spring.datasource.url=jdbc:mysql://localhost:3306/dms
spring.datasource.username=root
spring.datasource.password=test
spring.datasource.testWhileIdle = true
spring.jpa.show-sql = true

#liquibase
com.foo.bar.liquibase.changelog=classpath:/db/changelog/db.changelog.xml

アプリケーションを実行すると、次のエラーが表示されます。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'liquibaseConfiguration': Unsatisfied dependency expressed through field 'dataSource': No qualifying bean of type [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] found for dependency [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] found for dependency [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

これは、アプリケーションがMysqlDataSource dataSource;しかし、データソースをliquibase Beanに渡す必要があります。どうやってやるの?

9
Muhammad Ramahy

春のブーツにリキベースを統合する簡単な手順は次のとおりです

ステップ1

Liquibase依存関係を追加する

Gradle

runtime "org.liquibase:liquibase-core"

メイベン

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <scope>runtime</scope>
</dependency>

ステップ2

application.ymlにliquibase変更ログファイルのパスを追加

liquibase:
  enabled: true #this is optional as enabled by default
  change-log: classpath:/liquibase/db-changelog.xml

プロパティliquibase.change-log.パスを/liquibase/db-changelog.xml.として参照しているため、ファイル名を指定する必要がありますdb-changelog.xml =内部src/main/resources/liquibase/

ステップ3

ファイルにチェンジセットを追加し、Spring-Bootアプリケーションが開始されると(spring-boot:run)チェンジセットがロードされます。

これは、アプリが使用するデフォルトのdataSourceを使用します。

詳細: http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup

更新

@vebenがコメントの使用で指摘したSpring Boot 2.0の場合

spring:
    liquibase:
        change-log: #path
14
Aman Tuladhar

私のアプリケーションには同様の構成がありましたが、より一般的なjavax.sql.DataSourceを代わりに注入してみましたか?

私の推測では、SpringはこのBeanに非固有のタイプを使用し、さらに、アプリケーションがまったく異なるソースを使用するように構成できる場合、つまりデータソースURLを変更するだけで、データベース固有のタイプを使用するべきではありません。構成ファイル内。

0
DoNuT