BeanUtils.copyProperties解决null值覆盖问题

16 篇文章 0 订阅

这里使用的是Spring提供的BeanUtils的工具类(commons-lang3可参考)。在做数据变更的时候,使用BeanUtils.copyProperties(newdata,dbdata)进行数据变更的时候,由于前台展示的数据不完整。导致前台传递的数据将后台的原始数据全部覆盖掉。那么如何解决这种null值的覆盖呢。BeanUtils.copyProperties()可以通过添加可变长参数忽略掉具体的某些不需要更新的字段。比如BeanUtils.copyProperties(newdata,dbdata,“id”,“password”)。

那么如果字段比较多,使用上面的方法简直要疯掉了。有没有更好的方法呢?
可以自己拓展一个方法,汇总值为null的数据。

public static String[] getNullPropertyNames (Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> emptyNames = new HashSet<String>();
        for(PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null) emptyNames.add(pd.getName());
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }

通过这个方法就可以将null数据找到,然后在可变长参数中使用方法即可。

BeanUtils.copyProperties(newdata,dbdata,getNullPropertyNames(newdata));

附demo:

public static void main(String[] args) {
    U u = new U("1","zhangsan",null,null,null,"11");
    String[] nullPropertyNames = getNullPropertyNames(u);
    for (String nullPropertyName : nullPropertyNames) {
        System.out.println(nullPropertyName);
    }
}

public static String[] getNullPropertyNames (Object source) {
    final BeanWrapper src = new BeanWrapperImpl(source);
    PropertyDescriptor[] pds = src.getPropertyDescriptors();
    Set<String> emptyNames = new HashSet<String>();
    for(PropertyDescriptor pd : pds) {
        Object srcValue = src.getPropertyValue(pd.getName());
        if (srcValue == null) emptyNames.add(pd.getName());
    }
    String[] result = new String[emptyNames.size()];
    return emptyNames.toArray(result);
}

class U {
        private String id;
        private String name;
        private String field1;
        private String field2;
        private String field3;
        private String field4;

        public U(String id, String name) {
            this.id = id;
            this.name = name;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getField1() {
            return field1;
        }

        public void setField1(String field1) {
            this.field1 = field1;
        }

        public String getField2() {
            return field2;
        }

        public void setField2(String field2) {
            this.field2 = field2;
        }

        public String getField3() {
            return field3;
        }

        public void setField3(String field3) {
            this.field3 = field3;
        }

        public String getField4() {
            return field4;
        }

        public void setField4(String field4) {
            this.field4 = field4;
        }

        public U(String id, String name, String field1, String field2, String field3, String field4) {
            this.id = id;
            this.name = name;
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
            this.field4 = field4;
        }
    }

打印的结果:

field1
field2
field3

好了问题解决

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值