如何使Spring Boot使用MultiTenantSpringLiquibase?

问题描述 投票:1回答:3

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

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

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

spring spring-boot liquibase
3个回答
1
投票

在application.properties中,添加此项。

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration 

或者在您的Main类中使用它。

@SpringBootApplication(exclude={LiquibaseAutoConfiguration.class})

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.