24.6.5 合并YAML列表

正如上面看到的,所有YAML最终都转换为properties,在通过一个profile覆盖”list”属性时这个过程可能不够直观(counter intuitive)。例如,假设有一个MyPojo对象,默认它的namedescription属性都为null,下面我们将从FooProperties暴露一个MyPojo对象列表(list):

  1. @ConfigurationProperties("foo")
  2. public class FooProperties {
  3. private final List<MyPojo> list = new ArrayList<>();
  4. public List<MyPojo> getList() {
  5. return this.list;
  6. }
  7. }

考虑如下配置:

  1. foo:
  2. list:
  3. - name: my name
  4. description: my description
  5. ---
  6. spring:
  7. profiles: dev
  8. foo:
  9. list:
  10. - name: my another name

如果dev profile没有激活,FooProperties.list将包括一个如上述定义的MyPojo实体,即使dev生效,该list仍旧只包含一个实体(name值为my another namedescription值为null)。此配置不会向该列表添加第二个MyPojo实例,也不会对该项进行合并。

当一个集合定义在多个profiles时,只使用优先级最高的:

  1. foo:
  2. list:
  3. - name: my name
  4. description: my description
  5. - name: another name
  6. description: another description
  7. ---
  8. spring:
  9. profiles: dev
  10. foo:
  11. list:
  12. - name: my another name

在以上示例中,如果dev profile激活,FooProperties.list将包含一个MyPojo实体(name值为my another namedescription值为null)。