nacos map及listmap 配置项bind bug

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与原有不同,旧数据会保留
nacos map及listmap 配置项bind bug_第1张图片
解决办法是修改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);
	}```

你可能感兴趣的:(nacos)