如何使Spring Boot使用MultiTenantSpringLiquibase?

时间:2018-09-11 12:26:19

标签: spring spring-boot liquibase

在Spring Boot应用程序中,我希望Liquibase在PostgreSQL数据库上创建表,因此在我的配置类中,我设置了一个Bean,该Bean返回一个MultiTenantSpringLiquibase,其中包含应使用的架构名称。

问题是创建了该Bean,但忽略了它,Spring Boot在LiquibaseAutoConfiguration中找到了一个有效的SpringLiquibase Bean,并在我的数据库中使用它,访问了与MultiTenantSpringLiquibase相同的变更日志。之所以失败,是因为此配置尝试使用不存在的架构“ public”。如果确实存在,它将创建我在变更日志中定义的表,但是我不希望它们出现在“公共”模式中。

如何防止执行LiquibaseAutoConfiguration或SpringLiquibase,以代替使用我的MultiTenantSpringLiquibase Bean?

2 个答案:

答案 0 :(得分:1)

默认模式至少应具有SpringLiquibase bean。 在这种情况下,您可以跳过该bean的执行,但是需要声明它。

@Bean
public SpringLiquibase liquibase(@Qualifier("taskExecutor") TaskExecutor taskExecutor,
                                     DataSource dataSource, LiquibaseProperties liquibaseProperties) {
     SpringLiquibase liquibase = new AsyncSpringLiquibase(taskExecutor, env);
     liquibase.setDataSource(dataSource);
     liquibase.setChangeLog("path-to-xml");
     liquibase.setContexts(liquibaseProperties.getContexts());
     liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
    return liquibase;
}

完成此配置后,您应该能够创建MultiTenantSpringLiquibase Bean以在所有模式中运行:

@Bean
@DependsOn("liquibase") // ensure execution after SpringLiquibase Bean
public MultiTenantSpringLiquibase liquibaseMt(DataSource dataSource, LiquibaseProperties liquibaseProperties) {

    MultiTenantSpringLiquibase liquibase = new MultiTenantSpringLiquibase();

    liquibase.setDataSource(dataSource);
    liquibase.setChangeLog("path-to-xml");
    liquibase.setDefaultSchema(YOUR_DEFAULT_SCHEMA);
    liquibase.setSchemas(YOUR_ARRAY_OF_SCHEMAS);
    return liquibase;
}

执行SpringLiquibase后,MultiTenantSpringLiquibase将在您的模式中由行liquibase.setSchemas(...)调用并执行

此示例是我最近使用的工作示例。

完整的示例类here

答案 1 :(得分:0)

您尝试将其添加到application.properties文件中吗?

#Disable Liquibase
spring.liquibase.enabled=false

如果您不禁用它,我相信它会被执行:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration.java#L74

这只是一个主意,我不确定,但是您可以尝试,因为您拥有环境并且我只能推测。