我正在使用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}}
。
这是出于设计吗?如果是的话,有没有办法让它以我描述的方式运作?
答案 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中,或者确保覆盖默认配置中的每个属性。