如何让 Spring Boot 使用 MultiTenantSpringLiquibase?
How to make Spring Boot use MultiTenantSpringLiquibase?
在我的 Spring 引导应用程序中,我希望 Liquibase 在 PostgreSQL 数据库上创建表,因此在我的配置 类 中,我设置了一个 Bean returns MultiTenantSpringLiquibase 包含它应该使用的架构名称。
问题是创建了这个 Bean 但被忽略了,Spring Boot 在 LiquibaseAutoConfiguration 中找到一个有效的 SpringLiquibase Bean,并在我的数据库上使用它,访问我打算访问的相同变更日志多租户SpringLiquibase。这会失败,因为此配置试图使用不存在的架构 "public"。如果它确实存在,它会创建我在更改日志中定义的表,但我不希望它们出现在 "public" 架构中。
如何防止 LiquibaseAutoConfiguration 或 SpringLiquibase 执行,以便使用我的 MultiTenantSpringLiquibase Bean?
您是否尝试将此添加到您的 application.properties 文件中:
#Disable Liquibase
spring.liquibase.enabled=false
如果你不禁用它,我相信它会被执行:
这只是一个想法,我不确定,但是你可以尝试,因为你有环境,我只能推测。
在你的 application.properties 中添加这个。
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
或者在您的 Main class 中使用它。
@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;
}
完成此配置后,您应该能够在所有模式中为 运行 创建 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(...)
调用和执行
此示例是我最近使用的工作示例。
完整示例 class here.
在我的 Spring 引导应用程序中,我希望 Liquibase 在 PostgreSQL 数据库上创建表,因此在我的配置 类 中,我设置了一个 Bean returns MultiTenantSpringLiquibase 包含它应该使用的架构名称。
问题是创建了这个 Bean 但被忽略了,Spring Boot 在 LiquibaseAutoConfiguration 中找到一个有效的 SpringLiquibase Bean,并在我的数据库上使用它,访问我打算访问的相同变更日志多租户SpringLiquibase。这会失败,因为此配置试图使用不存在的架构 "public"。如果它确实存在,它会创建我在更改日志中定义的表,但我不希望它们出现在 "public" 架构中。
如何防止 LiquibaseAutoConfiguration 或 SpringLiquibase 执行,以便使用我的 MultiTenantSpringLiquibase Bean?
您是否尝试将此添加到您的 application.properties 文件中:
#Disable Liquibase
spring.liquibase.enabled=false
如果你不禁用它,我相信它会被执行:
这只是一个想法,我不确定,但是你可以尝试,因为你有环境,我只能推测。
在你的 application.properties 中添加这个。
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
或者在您的 Main class 中使用它。
@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;
}
完成此配置后,您应该能够在所有模式中为 运行 创建 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(...)
此示例是我最近使用的工作示例。
完整示例 class here.