合并来自多个 spring-boot YAML 文件的列表

Combine list from multiple spring-boot YAML files

是否可以合并来自多个 spring-用 YAML 编写的引导配置文件的相同元素的列表?

示例:

postgres.yml 包含我的 postgres 数据库信息。它还包含我的迁移脚本的飞路位置:

---
flyway:
  locations:
    - flyway/migrations/postgres

与我的 oracle 迁移相同:

---
flyway:
  locations:
    - flyway/migrations/oracle

现在,如果我想使用测试数据启动我的应用程序,我还想包含我的 test_data 目录(这些数据适用于 postgres 和 oracle):

---
flyway:
  locations:
    - flyway/test_data

当我 运行 具有活动配置文件的应用程序 postgres,testdata 时,不会加载迁移,因为位置条目已被测试数据文件覆盖。

对于此设置,我可以为每个数据库创建四个配置文件 运行,有和没有测试数据,但是如果我有四个不同的数据库和三组测试数据,我该怎么办?

不幸的是,如 Spring docs 中所述,这目前是不可能的。如果您提前知道配置文件名称集,您可能可以通过创建单独的列表来解决这个问题,列表以配置文件名称为前缀,然后在您的 bean 中包含将它们合并到最终列表中的代码。该代码只会遍历所有已知的配置文件名称前缀,如果配置文件未激活,则该列表将为空。

不幸的是,如果您不拥有该 bean,这似乎更难,例如在您的 Flyway 案例中。不过还是有可能的。

可怕的 hack:如果您通过调用

创建了多个 SpringBoot 应用程序上下文会怎样

SpringApplication.run(MyClass.class)

多次使用不同的配置文件。获取不同的列表并将它们合并为一个。