如何让Spring Boot使用MultiTenantSpringLiquibase?

如何让Spring Boot使用MultiTenantSpringLiquibase?,spring,spring-boot,liquibase,Spring,Spring Boot,Liquibase,在我的Spring Boot应用程序中,我希望Liquibase在PostgreSQL数据库上创建表,因此在我的配置类中,我设置了一个Bean,它返回一个包含它应该使用的模式名称的Bean 问题是这个Bean被创建但被忽略了,Spring Boot在LiquibaseAutoConfiguration中找到了一个有效的SpringLiquibase Bean,并在我的DB上使用它,访问我打算用于MultitenantsSpringLiquibase的相同变更日志。此操作失败,因为此配置尝试使用不

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

问题是这个Bean被创建但被忽略了,Spring Boot在LiquibaseAutoConfiguration中找到了一个有效的SpringLiquibase Bean,并在我的DB上使用它,访问我打算用于MultitenantsSpringLiquibase的相同变更日志。此操作失败,因为此配置尝试使用不存在的架构“public”。如果它确实存在,它将创建我在变更日志中定义的表,但我不希望它们出现在“公共”模式中


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

是否尝试将其添加到application.properties文件中:

#Disable Liquibase
spring.liquibase.enabled=false
如果你不禁用它,我相信它会被执行:


这只是一个想法,我不确定,但你可以试试,因为你有环境,我只能推测。

在你的application.properties中,添加这个

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration 
或者在你的主要课堂上使用这个

@SpringBootApplication(exclude={LiquibaseAutoConfiguration.class})

默认模式至少应该有
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;
}
完成此配置后,您应该能够创建
multi-tenantspringliquibase
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
后,
multi-tenantspringliquibase
将通过
liquibase.setSchemas(…)

这个示例是我最近使用的一个工作示例


完整示例类。

我尝试过几次,该属性确实阻止执行不需要的SpringLiquibase,但我的MultiTenantsSpringLiquibase似乎也被禁用。我试图理解在DB上“执行”所选Liquibase配置的机制,因为我不确定是否正确地假设我的表应该在没有其他配置的情况下创建。当我有更多信息时,我会添加详细信息。也许需要一个MWE,但在这种情况下,它需要Spring引导、一个数据库和一个使用MultitenantsSpringLiquibase的配置类。星期一我在这里回答。试试这个代码示例:您可以跳过默认模式,只在其他模式中执行迁移。如果我的回答是有效的,你能给我们提供你对多租户SpringLiquibase的bean定义吗?因为这个类实现了InitializingBean接口,所以Spring应该在将bean添加到应用程序上下文之后立即调用AfterPropertieSet方法。当您将调试器断点设置到此方法中时会发生什么情况?这是一个有效的答案,我可以使用“shouldRun=false”设置SpringLiquibase Bean,但在我的情况下,由于我根本不使用默认模式,我更喜欢使用Jade Devin Nocum Cabatlao的解决方案,它更准确地回答了我的特定问题(使Spring引导仅使用MultiTenantsSpringLiquibase,并避免在默认架构上运行任何内容)。感谢您让我了解这是如何工作的。当然!事实上,我也从我的应用程序类中排除了de LiquebaseAutoConfig!让我们保留这个可能对其他人有帮助的答案。无法使其工作:始终在创建的第一个架构上获取错误。错误:表已成为租户1的激励项。表名…我正在尝试创建Jhipster multi tenant应用程序正是我想要的!我想知道为什么这么难找到它,可能是因为MultiTenantSpringLiquibase和Spring Boot的组合,以及只使用没有“通用”模式的multitenant的特殊需要。