Spring Boot - 合并地图属性的地图

时间:2017-08-24 10:24:20

标签: java spring spring-boot

我正在使用Spring Boot 1.5.6并具有如下配置属性:

@Component
@Getter
@Setter
@ConfigurationProperties("test")
public class TestProperties {
    private Map<Integer, Integer> map;
    private Map<String, Map<Integer, Integer>> mapOfMaps;
}

和两个yaml配置文件:

application.yml

test:
  map:
    1: 10
    2: 20
  mapOfMaps:
    KEY1:
      1: 10
      2: 20
    KEY2:
      3: 30
      4: 40

application-dev.yml

test:
  map:
    100: 100
  mapOfMaps:
    KEY1:
      100: 100

当我使用dev个配置文件运行我的应用程序时,我预计这两个属性仅包含dev个配置文件值(因此基本上与application-dev.yml匹配)。

示例项目可在此处获取:https://github.com/poznachowski/spring-boot-mapmerge

对于简单的map属性,它工作正常,但对于mapOfMaps属性,它会解析为{KEY1={100=100}, KEY2={3=30, 4=40}}

这是出于设计吗?如果是的话,有没有办法让它以我描述的方式运作?

1 个答案:

答案 0 :(得分:1)

这是按设计工作的。可以看到application.yml为要覆盖的其他配置文件提供默认值。

基本上,基本配置将与您启用的配置文件合并,但活动配置文件中的键将取代默认配置。

Spring Boot - Properties & configuration documentation

当我使用spring boot 1.5.6.RELEASE运行你的例子时,生成的配置对象如下所示:

test:
  map:
    1: 10
    2: 20
    100: 100
  mapOfMaps:
    KEY1:
      1:10
      2:20
      100:100
    KEY2:
      3: 30
      4: 40

如果您想让一个或另一个配置处于活动状态,您必须将第一个配置放在另一个应用程序 - {profile} .yml中,或者确保覆盖默认配置中的每个属性。