【发布时间】:2017-01-03 22:03:56
【问题描述】:
我有一个 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
如您所见,cars 是一个列表,但 cars-default 不是。我知道,如果您定义默认配置文件以使“扁平化”布局与您的活动配置文件相匹配,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 的这方面不够熟悉,所以我真的不知道在哪里开始。
【问题讨论】:
-
您的陈述“如您所见,汽车是一个列表,但汽车默认不是”是错误的,即使您将其重写为“如您所见,的值 cars 是一个序列,但 cars-default 的值不是"。两个值都是序列。
cars是作为字符串加载的标量,cars-default也是如此。它们都是 YAML 配置文件中 two 文档中每个顶级映射的键。 YAML 没有称为List的概念。List是在 Java 程序中加载 YAML 文件时表示的序列。您的第二个“文件”是无效的 YAML -
抱歉,很晚,YAML 输入错误。它已被修复。顺便说一句 - 如果我将 cars-default 更改为一个序列并将密钥更改为“cars:”,Spring 会将默认值与活动(主)配置文件中的第一个序列合并,而不是其余的。这就是我试图通过 Spring 以编程方式实现的目标,如果可能的话。
标签: spring properties spring-boot configuration yaml