解决 SpringBeanUtils 的 copyProperties 默认会复制 null 属性的问题
前言
假设有个 Person
类, 其有两个属性 name
和 age
这里有两个对象 person1
和 person2
person1
的 name
为 p
, age
为 null
person2
的 name
为 null
, age
为 123
直接使用 BeanUtils.copyProperties(person1,person2)
的话,复制完毕后的属性就会是
person1, name: p, age: null
person2, name: p, age: null
某些时候我们并不想让已有的属性被 null 覆盖, 这个时候就需要用到 BeanUtils.copyProperties
的一个重载方法了。
解决
public static <T> T copyPropertiesIgnoreNull(Object src, T dst) {
final BeanWrapper beanWrapper = new BeanWrapperImpl(src);
BeanUtils.copyProperties(src, dst, Arrays
.stream(beanWrapper.getPropertyDescriptors())
.map(FeatureDescriptor::getName)
.filter(name -> beanWrapper.getPropertyValue(name) == null)
.toArray(String[]::new)
);
return dst;
}
同样的上边的例子, 使用这个方法复制属性的结果是
person1, name: p, age: null
person2, name: p, age: 123