首页 > 其他分享 >Bean对象之间属性复制

Bean对象之间属性复制

时间:2024-11-07 18:58:43浏览次数:4  
标签:amazonCopy amazon String Amazon Bean 复制 new null 属性

在使用Spring的BeanUtils 复制属性时会存在一个问题,就是源对象的属性会全部覆盖带目标对象上,即使源对象的属性为null,就像下面这样.

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class Amazon{
        private String site;
        private String productName;
        private BigDecimal price;
        private String telNumber;
        private String shipmentName;
    }


    @Test
    public void copy(){
        Amazon amazon = new Amazon();
        amazon.setPrice(BigDecimal.valueOf(50.22));
        amazon.setSite("US");
        amazon.setShipmentName("James");

        Amazon amazonCopy = new Amazon();

        amazonCopy.setTelNumber("01-845754-451524");
        amazonCopy.setProductName("Computer");

        System.out.println("before "+amazonCopy);
        BeanUtils.copyProperties(amazon,amazonCopy);

        System.out.println("after "+amazonCopy);
    }

输出

before TestClass.Amazon(site=null, productName=Computer, price=null, telNumber=01-845754-451524, shipmentName=null)
after TestClass.Amazon(site=US, productName=null, price=50.22, telNumber=null, shipmentName=James)

明显看到了amazonCopy原来的telNumber和productName 的内容都被覆盖了,但是想要目标对象的属性存在的不被覆盖,需要怎么做呢?其实BeanUtils提供了了三个参数copyProperties方法,最后一个就是不需要复制属性名。

那么可以基于这个操作,实现目标对象存在的属性不需要被覆盖。

    @Test
    public void copy(){
        Amazon amazon = new Amazon();
        amazon.setPrice(BigDecimal.valueOf(50.22));
        amazon.setSite("US");
        amazon.setShipmentName("James");

        Amazon amazonCopy = new Amazon();

        amazonCopy.setTelNumber("01-845754-451524");
        amazonCopy.setProductName("Computer");

        System.out.println("before "+amazonCopy);
        BeanUtils.copyProperties(amazon,amazonCopy,getNonNullPropertyNames(amazonCopy));

        System.out.println("after "+amazonCopy);
    }

    /**
     * Get fields whose attributes are not null
     *
     * @param source meta data
     * @return not null filed value
     */
    public static String[] getNonNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> emptyNames = new HashSet<>();
        for (PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue != null) {
                emptyNames.add(pd.getName());
            }
        }
        return emptyNames.toArray(new String[0]);
    }
before TestClass.Amazon(site=null, productName=Computer, price=null, telNumber=01-845754-451524, shipmentName=null)
after TestClass.Amazon(site=US, productName=Computer, price=50.22, telNumber=01-845754-451524, shipmentName=James)

可以看到属性存在值得没有被替换成null。

标签:amazonCopy,amazon,String,Amazon,Bean,复制,new,null,属性
From: https://www.cnblogs.com/lyuSky/p/18533779

相关文章

  • 关于SQL_Errno:1677导致主从复制中断的思考和实践【转】
    1、简单介绍该错误发生的背景:1)数据库版本:MySQL5.7.192)对一个大表修改字段类型DDL(将主键idint变为bigint),为了不影响主库业务,先在从库上执行DDL操作,然后通过主从切换完成最终的大表DDL;在从库执行完DDL后,这时发现复制中断了,报错信息:12Last_SQL_Errno:1677Last_SQ......
  • Failed to load local image resource(在小程序中,`src` 属性需要使用双花括号 `{{ }}`
    文章目录修改WXML文件确保图像文件路径正确检查逻辑层代码总结[渲染层网络层错误]Failedtoloadlocalimageresource/components/antiFakeQuery/imageSrctheserverrespondedwithastatusof500(HTTP/1.1500InternalServerError)(env:Windows......
  • 线程的概念、作用和属性
    线程的概念、作用和属性线程的概念理解:线程可视作“轻量级进程”。线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文......
  • Mit6.S081笔记Lab6: Lab6: Copy-on-Write Fork for xv6 写时复制
    课程地址:https://pdos.csail.mit.edu/6.S081/2020/schedule.htmlLab地址:https://pdos.csail.mit.edu/6.S081/2020/labs/cow.html我的代码地址:https://github.com/Amroning/MIT6.S081/tree/cowxv6手册:https://pdos.csail.mit.edu/6.S081/2020/xv6/book-riscv-rev1.pdf相关翻译......
  • vue—ref属性
    原文链接:vue—ref属性–每天进步一点点 在vue中ref属性基本有两个作用,一个是获取dom元素,另一个是获取组件实例化对象。初始页面和初始代码如下:123456789101112131415161718192021222324252627282930313233343536<template>......
  • DICOM标准:DICOM图像核心属性概念详解——关于参考帧、病人位置、病人方位、图像位置和
    目录1、参考帧模块属性2、模态(Modality):3、病人位置(PatientPosition):4、病人方位(PatientOrientation):5、 图像位置和图像方向:6、切片位置7、图像像素模块7.1  图像像素属性描述7.1.1 每个像素的样本7.1.2光度解释7.1.3平面结构7.1.4像素数据1、参......
  • Java面试系列-MySQL面试题20道,InnoDB,索引类型,事务隔离级别,锁机制,MVCC,主从复制,慢查询,分
    文章目录1.MySQL中的InnoDB和MyISAM存储引擎有什么区别?2.MySQL中的索引类型有哪些?3.MySQL中的索引是如何工作的?4.MySQL中的事务隔离级别有哪些?5.MySQL中的锁机制有哪些?6.MySQL中的MVCC(多版本并发控制)是如何工作的?7.MySQL中的主从复制是如何工作的?8.MySQL中的分区......
  • 系统变量group_replication_group_seeds为空导致MySQL节点无法启动组复制
    MySQLInnoDBCluster集群中一个节点,在服务器重启过后,启动MySQL实例后,发现status为MISSING,另外memberState为OFFLINE状态。如下所示: MySQL  mysqldbu02:7306 ssl  JS > cluster.status(){    "clusterName": "yssps",     "defaultReplicaSet": {      ......
  • 这款Chrome 插件,帮助我们复制网页上不能复制的内容
    前言最近在上网查找博客时,经常遇到想要复制网页上的内容,但是,一点击复制,就会弹出来各种各样的弹框,导致复制不能继续,非常麻烦。这时,我想到了一个办法,那就是下载安装一个chrome插件,那今天就介绍给大家,让大家上网复制文本时可以任性。如何复制首先,我们需要安装一个插件,SimpleAl......
  • 数据处理与统计分析——01-Numpy的属性&ndarray数组创建
    Numpy的属性Numpy简介NumPy(NumericalPython)是Python数据分析必不可少的第三方库NumPy的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型,使其具备了构造复杂数据类型的能力。本身是由C语言开发,是个很基础的扩展,NumPy被Python其它科学计算包作......