例如有个对象要提交,提交一次,第二次提交我们希望是对上次提交的完善。。那么用其他方式实现很麻烦,本身的BeanUtils.copyProperties也是不大支持。
hutool开源库为我们提供了更为强大的Bean工具-BeanUtil,
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.14</version>
</dependency>
以上问题,只需要一句代码就搞定!!!
BeanUtil.copyProperties(oldDetail.get(),userDetail,true, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
核心代码是 CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true)
详情可以参考官方文档 http://hutool.mydoc.io/#text_319433 。
更详细的业务场景如下:
public Object save(UserDetail userDetail){
if(userDetail.getUserId()==0){
return ApiReturnUtil.error("userId不能为空");
}else{
//复制一个新的用于保存
UserDetail newDetail=new UserDetail();
BeanUtil.copyProperties(userDetail,newDetail);
Optional<UserDetail> oldDetail=userDetailRepository.findById(userDetail.getUserId());
if (oldDetail.isPresent()){
System.out.println("copying");
//复制旧的属性过来,忽略null属性,忽略null值,有值的以新的为主,null的则以旧为主
BeanUtil.copyProperties(oldDetail.get(),userDetail,true, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
}
//复制新的所有非null来覆盖旧的
BeanUtil.copyProperties(userDetail,newDetail,true, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
userDetailRepository.save(newDetail);
return ApiReturnUtil.success("保存成功",newDetail);
}
}
CopyOptions参数提供一些BeanUtils.copyProperties注入属性的选项。
使用方法如下:
BeanUtil.copyProperties(oldObject,newObject,true, CopyOptions.create().setXXXX(true))
;