nacos spring boot 0.2.3 支持了配置list及listmap 属性(configuration),在sample中也带了一个例子,示意yaml文件如下
---
list:
- "Boston Red Soxe"
- "Detroit Tigers"
- "New York Yankees"
listMap:
l1: "New York Mets"
l2: "Chicago Cubs"
但此处有bug,nacos是通过Spring 的RelaxedDataBinder binder = new RelaxedDataBinder(bean, properties.prefix()); 来实现的,RelaxedDataBinder 默认在更新的时候是使用update原有内容来实现,因此当list item数量比原有少,或者map 的key与原有不同,旧数据会保留
解决办法是修改public class NacosBootConfigurationPropertiesBinder的doBind函数,在
binder.bind(new MutablePropertyValues(prop));
前加入 ObjectUtils.cleanMapOrCollectionField(bean);
另外根据应用需要考虑加入同步执行机制,如果更新不频繁,可以简单使用synchronized。
@Override
protected void doBind(Object bean, String beanName, String dataId, String groupId,
NacosConfigurationProperties properties, String content, ConfigService configService) {
String configType = properties.yaml() ? ConfigType.YAML.getType() : properties.type().getType();
Properties prop = toProperties(dataId, groupId, content, configType);
RelaxedDataBinder binder = new RelaxedDataBinder(bean, properties.prefix());
MutablePropertyValues mut = new MutablePropertyValues(prop);
synchronized(bean) {
ObjectUtils.cleanMapOrCollectionField(bean);
binder.bind(mut);
}
publishBoundEvent(bean, beanName, dataId, groupId, properties, content, configService);
publishMetadataEvent(bean, beanName, dataId, groupId, properties);
}