Spring Boot项目中基于YAML的配置缺省问题

时间:2016-08-27 09:50:18

标签: spring properties spring-boot configuration yaml

我有一个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的这方面不太熟悉,所以我真的不知道从哪里开始。

1 个答案:

答案 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必须忽略锚值中的默认值,因此您可能需要找到一些“注释”键值对并将其隐藏在值部分中。