解决 SpringBeanUtils 的 copyProperties 默认会复制 null 属性的问题

前言

假设有个 Person 类, 其有两个属性 nameage
这里有两个对象 person1person2
person1namep, agenull
person2namenull, age123
直接使用 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

posted @ 2022-07-11 11:56  博麗靈夢  阅读(1558)  评论(0编辑  收藏  举报