使用场景:针对两个对象相互拷贝,然后只替换不为Null的值,自带的BeanUtils无法实现,所以单独在网上找了一个然后进行使用,可忽略Null值的拷贝。

最近做一个实训项目,然后持久层使用的JPA,前端使用的Layui,更新的时候如果前端传入了部分字段,那么其他字段没有传入就不做更新,在JPA当中默认传入一个完整的对象,一般都是直接先查询然后再修改这样操作 ,但是前端目前只要求传入什么就修改什么,没有传入的默认不修改,意思就是只修改部分字段内容,所以需要我后端先根据ID查询信息然后再修改就要使用到克隆对象忽略Null值,目前这个工具类就可以实现。

CopyUtils工具类代码:

/**
 * CopyUtils
 *
 * @author lcry
 * @date 2019/09/19 17:31
 * 对象互相拷贝忽略Null值
 */
public class CopyUtils {
    public static String[] getNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();

        Set<String> emptyNames = new HashSet<String>();
        for (java.beans.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);
    }

    public static void copyProperties(Object src, Object target) {
        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
    }
}

使用方法非常简单:

    /**
     * 修改
     *
     * @param employee
     */
    public void update(Employee employee) {
//        只更新部分字段、2019年9月19日 17:24:11 - 若前端不传入就不更新
        Employee desinfo = employeeDao.findById(employee.getId()).get();
        if (Validator.isNotEmpty(desinfo)) {
            CopyUtils.copyProperties(desinfo, employee);
            employeeDao.save(employee);
        }
    }

可以自行做测试,比BeanUtils中拷贝对象更好使用~

    @Test
    public void testcopytest() {
//        初始化第一个对象只设置name
        Employee employee1 = new Employee();
        employee1.setName("Lcry");
//        toString查看对象信息
        System.out.println("初始化employee1->" + employee1);
//        初始化第二个对象,不设置name,设置其他值
        Employee employee2 = new Employee();
        employee2.setAddress("123");
        employee2.setDepid("1");
        employee2.setPassword("123456");
        employee2.setAge(22);
        employee2.setEmail("i@51it.wang");
        System.out.println("初始化employee2->" + employee2);
//        采用CopyUtils只拷贝不为空的属性,name属性为赋值为employee2
        CopyUtils.copyProperties(employee1, employee2);
        System.out.println("通过CopyUtils的employee2->" + employee2);
//        采用自带的BeanUtil只能全部复制、包括Null值
        BeanUtils.copyProperties(employee1,employee2);
        System.out.println("通过BeanUtil的employee2->" + employee2);
    }

打印日志:

初始化employee1->Employee(id=null, name=Lcry, status=null, sex=null, address=null, img=null, phone=null, email=null, password=null, entrytime=null, age=null, empnum=null, title=null, depid=null)
初始化employee2->Employee(id=null, name=null, status=null, sex=null, address=123, img=null, phone=null, email=i@51it.wang, password=123456, entrytime=null, age=22, empnum=null, title=null, depid=1)
通过CopyUtils的employee2->Employee(id=null, name=Lcry, status=null, sex=null, address=123, img=null, phone=null, email=i@51it.wang, password=123456, entrytime=null, age=22, empnum=null, title=null, depid=1)
通过BeanUtil的employee2->Employee(id=null, name=Lcry, status=null, sex=null, address=null, img=null, phone=null, email=null, password=null, entrytime=null, age=null, empnum=null, title=null, depid=null)

参考链接:
https://blog.csdn.net/u010186511/article/details/51595720