如何让Spring Boot使用MultiTenantSpringLiquibase?

Phi*_*fer 2 spring liquibase spring-boot

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

问题是这个 Bean 被创建但被忽略,Spring Boot 在 LiquibaseAutoConfiguration 中找到一个有效的 SpringLiquibase Bean,并在我的数据库上使用它,访问我为 MultiTenantSpringLiquibase 准备的相同更改日志。此操作失败,因为此配置尝试使用不存在的模式“public”。如果它确实存在,它会创建我在更改日志中定义的表,但我不希望它们出现在“公共”模式中。

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

Dei*_*zan 5

您至少应该拥有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;
}
Run Code Online (Sandbox Code Playgroud)

完成此配置后,您应该能够创建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;
}
Run Code Online (Sandbox Code Playgroud)

执行后SpringLiquibaseMultiTenantSpringLiquibase将通过该行在您的模式中调用并执行liquibase.setSchemas(...)

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

完整的示例类在这里