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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2020美赛A题翻译

    2020美赛A题翻译对于一些生活在海洋里的物种,全球海洋温度影响它们栖息地的质量。当对于它们的后续繁衍来说温度改变太大的时候,这些物种就会迁徙去寻找新的栖息地去更好地安放当前和未来的生殖繁衍。一个例子就是美国缅因州的龙虾的种群,它缓慢地往加拿大北部迁徙,那六更低的温度提供一个合适的栖息地环境。这种地理上的人口转移可能会对那些依赖海洋生物稳定性的公司的生计造成严重的破坏。您的团队已被苏格兰北大西洋渔业…

    2022年5月25日
  • ERROR: Could not install packages due to an OSError: [WinError 5] Access is denied

    ERROR: Could not install packages due to an OSError: [WinError 5] Access is deniedERROR:CouldnotinstallpackagesduetoanOSError:[WinError5]Accessisdenied:Considerusingthe`–user`optionorcheckthepermissions.【解决方案】

    2022年9月12日
  • js数组的splice方法_js数组删除某一项

    js数组的splice方法_js数组删除某一项JS数组删除splice和delete

    2022年9月28日
  • iOS 用UIScrollView不能获取到touchesBegan

    iOS 用UIScrollView不能获取到touchesBegan网上查了一下 原来UIScrollView是没有继承touchesBegan方法的所以要自己重写UIScrollView然后继承 touchesBegan等方法才可以用重写UIScrollView很简单代码下.h//// myScrollView.h// WFClient//// Createdby屎壳郎情调on1

    2022年7月25日
  • SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解

    SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解固态硬盘概念固态驱动器(SolidStateDrive),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,因为台湾英语里把固体电容称之为Solid而得名。SSD由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。被广泛应用于军事、车载、工控、视频监控、网络监控、网…

    2022年4月28日
  • f stream_fstream

    f stream_fstreamofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器(  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout2、析取器(>>)  从流中输入数据

    2022年9月15日

发表回复

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

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