BeanUtils.copyProperties忽略null值/只拷贝非null属性

BeanUtils.copyProperties忽略null值/只拷贝非null属性问题场景例如有个对象要提交 提交一次 第二次提交我们希望是对上次提交的完善 那么用其他方式实现很麻烦 本身的 BeanUtils copyProperti 也是不大支持 解决方案 hutool 开源库为我们提供了更为强大的 Bean 工具 BeanUtil 只需要一句代码就搞定 BeanUtil copyProperti oldDetail get userDetail true Copy

问题场景

例如有个对象要提交,提交一次,第二次提交我们希望是对上次提交的完善。。那么用其他方式实现很麻烦,本身的BeanUtils.copyProperties也是不大支持。

2020-12-19更新 新增了更好用的BeanMerge方法,可以直接完整的copy对象属性,把两个属性合成到一个上面,详情请参考 《比BeanCopy好用的BeanMerge(java合并对象属性,把非空属性合成到目标对象上)》

解决方案

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_ 。

更详细的业务场景如下:

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配置项:

CopyOptions参数提供一些BeanUtils.copyProperties注入属性的选项。

  • editable 限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类。
  • ignoreNullValue 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
  • ignoreProperties 忽略的属性列表,设置一个属性列表,不拷贝这些属性值
  • ignoreError 是否忽略字段注入错误
    可以通过CopyOptions.create()方法创建一个默认的配置项,通过setXXX方法设置每个配置项。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220556.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:12
下一篇 2026年3月17日 下午8:12


相关推荐

  • j-link接口定义及实际使用[通俗易懂]

    j-link接口定义及实际使用[通俗易懂]使用j-link下载程序或者在线调试的时候,有两种模式:JTAG和SWD可以在keil中选择:下面是两种模式下,分别用的接口引脚:推荐使用SWD模式,因为更省引脚而且调试功能不受影响。在SWD模式下,实际只需要4个IO口就可以了,包括下载程序和在线调试。分别为:PA13/JTMS/SWDIO、PA14/JTCK/SWCLK、VCC、GND

    2022年5月28日
    109
  • 4k+ n8n 工作流合集:无代码 AI Agent 编排与 ETL 管道实战

    4k+ n8n 工作流合集:无代码 AI Agent 编排与 ETL 管道实战

    2026年3月15日
    3
  • Labelimg制作数据集「建议收藏」

    Labelimg制作数据集「建议收藏」Labelimg制作数据集1、安装labelimg①下载源码自行安装,安装步骤参考搜索文章下载地址:https://github.com/tzutalin/labelImg②下载打包版直接运行,Windows和Linux平台可用,无需编译下载地址:http://tzutalin.github.io/labelImg/2、图片标注①仿照VOC2007在py-faster-rc…

    2022年6月16日
    35
  • 编写自己的who命令

    编写自己的who命令
    今天自己照着书一步步敲了who命令的实现。老外写的有些书就是不错,一步步启发你告诉你怎么思考,怎么根据已有的线索查询联机帮助,怎么一步步最终解决问题。真不错。
    下面我就根据书上的思想,来回顾一下这将近2个小时的工作。

    1.who命令能

    2022年6月11日
    33
  • 一次完整的http请求过程是怎样的?

    一次完整的http请求过程是怎样的?我们打开浏览器 在地址栏输入 www wukong com 几秒后浏览器打开悟空问答的页面 那么这几秒钟内发生了哪些事情 我就带大家一起看看完整的流程 解析 URL 浏览器首先会对输入的 URL 进行验证 如果不合法的时候 那么会把输入的文字传给默认的搜索引擎 比如你只在地址栏输入 悟空问答 几个字 如果 URL 通过验证 那么可以解析得到协议 http 或者 https 域名 wukong 资源 首页 等信息 DNS 查询 浏览器会先检查域名信息是否在缓存中 再检查域名是否在

    2026年3月16日
    3
  • 最简洁的富文本编辑器

    最简洁的富文本编辑器summernote 富文本编辑器最容易上手 适合初次接触的新人只需要加入 summernote css 和 summernote js 就可以实现简单的编辑器 DOCTYPE tml htmllang quot en quot head head htmllang quot en quot

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号