在spring boot中为liquibase配置dataSource

时间:2017-01-05 17:32:30

标签: spring-boot liquibase applicationcontext

我有一个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。我怎么能这样做?

3 个答案:

答案 0 :(得分:11)

这是将liquibase集成到spring boot中的简单步骤

第1步

添加liquibase依赖

摇篮

runtime "org.liquibase:liquibase-core"

的Maven

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

第2步

application.yml

中添加liquibase changelog文件路径
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

更新

对于Spring Boot 2.0,正如@veben在评论使用中指出的那样

spring:
    liquibase:
        change-log: #path

答案 1 :(得分:1)

不是自动装配数据源,而是在您的 Liquibase 配置对象中创建一个方法来创建数据源。

private DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUsername("user");
    dataSource.setPassword("pswd");
    dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/db");
    dataSource.setSchema("dbName");
    return dataSource;
}

然后在你的 bean 生成方法中

liquibase.setDataSource(dataSource());

这让您有机会即时指定数据库参数,我仍然在 applications.properties 文件中拥有更改日志位置以及启用 liquibase。我试过了,对我有用。

答案 2 :(得分:0)

我的应用程序有类似的构造,您是否尝试过注入更通用的 javax.sql.DataSource

我的猜测是Spring为这个bean使用了非特定类型,除此之外,如果您的应用程序可以配置为使用完全不同的源,即使您不应该使用特定于数据库的类型,即只需更改配置文件中的数据源URL。