当前位置: 首页 > 知识库问答 >
问题:

如何让Spring Boot使用MultiTenantSpringLiquibase?

胡弘毅
2023-03-14

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

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

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

共有3个答案

司徒浩思
2023-03-14

您是否尝试将此添加到应用程序中。属性文件:

#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

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

李俭
2023-03-14

在您的应用程序中。属性,添加此。

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

或者在你的主要课堂上使用这个。

@SpringBootApplication(exclude={LiquibaseAutoConfiguration.class})
颜志业
2023-03-14

对于默认模式,您至少应该具有SpringLiquibasebean。在这种情况下,您可以跳过此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;
}

在此配置之后,您应该能够创建在所有模式中运行的MultiTenantSpringLiquibaseBean:

@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.set模式(...)

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

这里是完整的示例类。

 类似资料:
  • 我已经完成了用户注册和登录。但是我想在创建配置文件时加密密码。 这是我当前的配置 MongoDB连接 模型类:@ Document @ AllArgsConstructor @ NoArgsConstructor @ Data公共类用户{ @Id @Indexed私有字符串Id;@索引私有字符串地址;@索引私有字符串名称;@索引的私有字符串电子邮件;@索引私有字符串密码;@索引私有字符串角色;}

  • 基本上,我正在使用spring boot和thymeleaf创建一个餐厅餐饮网站(只是一个课程的练习),厨师提供自助餐,每个自助餐由不同的菜肴和不同的配料组成(对不起,我的英语)。 我的问题是:我应该使用来指示厨师制作的自助餐吗? 或者我应该直接使用(“/自助餐”)?因为对于配料的控制器,我最终会使用<代码>(“/厨师/{id}/自助餐/{id}/盘子{id}/配料”) ,它看起来很奇怪,但我认为

  • 我使用的是spring boot 1.2.8,但类不存在。没有这门课最好的方法是什么?

  • 问题内容: 我有以下功能: 现在,我想使用一次执行此功能: 问题是,不能腌制lambda,因此失败了。解决此问题的最简洁的方法是什么? 问题答案: 使用功能对象: 运行您的:

  • 我正在开发一个迁移软件,它将使用来自REST服务的未知数据。 我已经考虑过使用MongoDB,但我决定不使用它,而是使用PostgreSQL。 读完本文后,我试图在我的SpringBoot应用程序中使用SpringJPA实现它,但我不知道在我的实体中映射。 我试过了,但什么也不懂! 这里就是我所在的地方: 和... 下表: 我该怎么做? 注意:我不想/不需要一个实体来工作。我的JSON将永远是St

  • 我从使用 Maven 的 Quarkus 开始,似乎找不到解决方案: 我有一个 Quarkus 应用程序,依赖于库 和 。两者都作为“模块”(不是Maven模块!)导入到我的应用程序的IntelliJ IDEA项目中。 在开发模式下启动 Quarkus 时,它会忽略 和 的目标中的类,而是从 Maven 存储库加载它们。因此,对于 或 的每次更改,我都必须 相应的库,所以我的 Quarkus 应用