我有一个YAML配置文件,如下所示:
spring.profiles: master
cars:
-
color: red
style: sedan
doors: 4
-
color: blue
doors: 4
-
color: black
---
spring.profiles: default
cars-default:
color: not specified
style: not specified
doors: not specified
正如您所看到的,汽车是一个列表,但汽车默认不是。我知道如果你定义你的默认配置文件,那么"扁平化" layout与您的活动配置文件匹配,Spring将很乐意合并这两个配置文件,以便在活动配置文件中定义的属性将覆盖默认值。
我的挑战是我想要一个单个默认值集来覆盖每个List对象,因此结果属性最终会像这样:
cars:
-
color: red
style: sedan
doors: 4
-
color: blue
style: not specified
doors: 4
-
color: black
style: not specified
doors: not specified
为了使问题稍微复杂一点,这些属性映射到的Car POJO具有我们无法覆盖的硬编码默认值,因此只需填充Car对象和DefaultCar对象并应用合并对两人的操作不会起作用。
基本上,我需要做的是在实例化和设置Car对象中的值之前合并两组属性。
我希望有一种方法可以利用Spring的属性解析器,这样我可以覆盖默认行为,虽然我对Spring的这方面不太熟悉,所以我真的不知道从哪里开始。
答案 0 :(得分:0)
如果您的YAML解析器支持,您可能只能使用标准的YAML锚点和别名以及the merge key工具。这样:
spring.profiles: master
_: &car-default
color: not specified
style: not specified
doors: not specified
cars:
- <<: *car-default
color: red
style: sedan
doors: 4
- <<: *car-default
color: blue
doors: 4
- <<: *car-default
color: black
在兼容的解析器中加载,就像您使用:
一样spring.profiles: master
_:
color: not specified
style: not specified
doors: not specified
cars:
- color: red
style: sedan
doors: 4
- color: blue
style: not specified
doors: 4
- color: black
style: not specified
doors: not specified
确保锚点(&car-default
)在同一个YAML文档中定义(您有两个)并且在使用之前(使用*car-default
)。它不必被定义为(顶级或其他)键的值,映射可以是序列中的元素,例如,序列的第一个元素是cars
:
spring.profiles: master
cars:
- &car-default
color: not specified
style: not specified
doors: not specified
- <<: *car-default
color: red
style: sedan
doors: 4
- <<: *car-default
color: blue
doors: 4
- <<: *car-default
color: black
当然Spring必须忽略锚值中的默认值,因此您可能需要找到一些“注释”键值对并将其隐藏在值部分中。