Copy specific fields by using BeanUtils.copyProperties?

前端 未结 5 1921
执笔经年
执笔经年 2020-12-12 14:13

springframework.beans.BeanUtils is very useful to copy objects, and I use the \"ignoreProperties\" option frequently. However, sometimes I want to copy only spe

5条回答
  •  感动是毒
    2020-12-12 14:45

    You can use the BeanWrapper technology. Here's a sample implementation:

    public static void copyProperties(Object src, Object trg, Iterable props) {
    
        BeanWrapper srcWrap = PropertyAccessorFactory.forBeanPropertyAccess(src);
        BeanWrapper trgWrap = PropertyAccessorFactory.forBeanPropertyAccess(trg);
    
        props.forEach(p -> trgWrap.setPropertyValue(p, srcWrap.getPropertyValue(p)));
    
    }
    

    Or, if you really, really want to use BeanUtils, here's a solution. Invert the logic, gather excludes by comparing the full property list with the includes:

    public static void copyProperties2(Object src, Object trg, Set props) {
        String[] excludedProperties = 
                Arrays.stream(BeanUtils.getPropertyDescriptors(src.getClass()))
                      .map(PropertyDescriptor::getName)
                      .filter(name -> !props.contains(name))
                      .toArray(String[]::new);
    
        BeanUtils.copyProperties(src, trg, excludedProperties);
    }
    

提交回复
热议问题