24.6.5 Merging YAML lists
正如24.6.1 Loading YAML看到的,所有YAML最终都转换为properties,在通过一个profile覆盖"list"属性时这个过程可能不够直观(counter intuitive)。例如,假设有一个MyPojo
对象,默认它的name
和description
属性都为null
,下面我们将从FooProperties
暴露一个MyPojo
对象列表(list):
@ConfigurationProperties("foo")
public class FooProperties {
private final List<MyPojo> list = new ArrayList<>();
public List<MyPojo> getList() {
return this.list;
}
}
考虑如下配置:
foo:
list:
- name: my name
description: my description
---
spring:
profiles: dev
foo:
list:
- name: my another name
如果dev
profile没有激活,FooProperties.list
将包括一个如上述定义的MyPojo
实体,即使dev
生效,该list仍旧只包含一个实体(name
值为"my another name",description
值为null
)。此配置不会向该列表添加第二个MyPojo
实例,也不会对该项进行合并。
foo:
list:
- name: my name
description: my description
- name: another name
description: another description
---
spring:
profiles: dev
foo:
list:
- name: my another name
在以上示例中,如果dev
profile激活,FooProperties.list
将包含一个MyPojo
实体(name
值为"my another name",description
值为null
)。如果dev
profile未激活,FooProperties.list
将包含MyPojo
实体([MyPojo{name='my name', description='my description'}, MyPojo{name='another name', description='another description'}]
)
MyPojo
类必须包含setter
public class MyPojo {
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "MyPojo{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
}