beanutils.copyproperties属性值丢失_beanutils.populate用法

beanutils.copyproperties属性值丢失_beanutils.populate用法问题场景例如有个对象要提交,提交一次,第二次提交我们希望是对上次提交的完善。。那么用其他方式实现很麻烦,本身的BeanUtils.copyProperties也是不大支持。解决方案hutool开源库为我们提供了更为强大的Bean工具-BeanUtil,只需要一句代码就搞定BeanUtil.copyProperties(oldDetail.get(),userDetail,true,Copy…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

问题场景

例如有个对象要提交,提交一次,第二次提交我们希望是对上次提交的完善。。那么用其他方式实现很麻烦,本身的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_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配置项:

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

使用方法如下:
BeanUtil.copyProperties(oldObject,newObject,true, CopyOptions.create().setXXXX(true));

  • editable 限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类。
  • ignoreNullValue 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
  • ignoreProperties 忽略的属性列表,设置一个属性列表,不拷贝这些属性值
  • ignoreError 是否忽略字段注入错误
    可以通过CopyOptions.create()方法创建一个默认的配置项,通过setXXX方法设置每个配置项。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux -bash: redis-cli: command not found(亲测可行)

    Linux -bash: redis-cli: command not found(亲测可行)

    2022年2月8日
    56
  • java 转发与重定向_Java 转发和重定向的区别

    java 转发与重定向_Java 转发和重定向的区别转发是服务器行为,重定向是客户端行为1.转发在服务器端完成的;重定向是在客户端完成的2.转发的速度快;重定向速度慢3.转发的是同一次请求;重定向是两次不同请求4.转发不会执行转发后的代码;重定向会执行重定向之后的代码5.转发地址栏没有变化;重定向地址栏有变化6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成在servlet中调用转发、重定向的语句如下:request.getRequ…

    2025年9月6日
    7
  • Java构造函数调用顺序问题

    Java构造函数调用顺序问题java构造代码调用顺序研究。

    2022年6月22日
    27
  • 安防知识

    安防知识安全防范的概念定义  安全防范系统(SPS)security&protectionsystem以维护社会公共安全为目的,运用安全防范产品和其它相关产品所构成的入侵报警系统、视频安防监控系统、出入口控制系统、防爆安全检查系统等;或由这些系统为子系统组合或集成的电子系统或网络。  安全防范系统在国内标准中定义为security&protectionsystem(SPS),而国外

    2022年6月28日
    23
  • Swift4 String截取字符串

    Swift4 String截取字符串varstr1="AlexanderYeah";//1截取字符串的第一种方式//prefix截取前3个字符串varstr2=str1.prefix(3);print(str2);//suffix截取后3个字符串varstr3=str1.suffix(3);print(str3);//2截取一个范围的字符串//从0开始到倒数第二位结…

    2022年5月12日
    40
  • 【Hive】NVL函数「建议收藏」

    【Hive】NVL函数「建议收藏」NVL(expr1,expr2):1、空值转换函数;2、类似于mysql-nullif(expr1,expr2),sqlserver-ifnull(expr1,expr2)。备注:1、如果expr1为NULL,返回值为expr2,否则返回expr1。2、适用于数字型、字符型和日期型,但是expr1和expr2的数据类型必须为同类型。…

    2022年7月13日
    23

发表回复

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

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