iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >BeanUtils.copyProperties()所有的空值不复制问题怎么解决
  • 954
分享到

BeanUtils.copyProperties()所有的空值不复制问题怎么解决

2023-07-02 09:07:57 954人浏览 安东尼
摘要

本文小编为大家详细介绍“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”文章能

本文小编为大家详细介绍“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

BeanUtils.copyProperties()所有的空值不复制

第一种情况

所有为空值的属性都不copy

直接上代码吧~

public class UpdateUtil {        public static void copyNullProperties(Object source, Object target) {        BeanUtils.copyProperties(source, target, getNullField(source));    }        private static String[] getNullField(Object target) {        BeanWrapper beanWrapper = new BeanWrapperImpl(target);        PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();        Set<String> notNullFieldSet = new HashSet<>();        if (propertyDescriptors.length > 0) {            for (PropertyDescriptor p : propertyDescriptors) {                String name = p.getName();                Object value = beanWrapper.getPropertyValue(name);                if (Objects.isNull(value)) {                    notNullFieldSet.add(name);                }            }        }        String[] notNullField = new String[notNullFieldSet.size()];        return notNullFieldSet.toArray(notNullField);    }    public static void main(String[] args) {        TopMenuConfigEntity topMenuConfigEntity1 = new TopMenuConfigEntity();        topMenuConfigEntity1.setWardCode("cat");        topMenuConfigEntity1.setTitle("animal");        TopMenuConfigEntity topMenuConfigEntity2 = new TopMenuConfigEntity();        topMenuConfigEntity2.setWardCode("dog");        UpdateUtil.copyNullProperties(topMenuConfigEntity2,topMenuConfigEntity1);        System.out.println(topMenuConfigEntity1.getTitle());    }}

执行main 方法后,topMenuConfigEntity1的title还是为原来的“animal”值,没有被topMenuConfigEntity2 的空值覆盖。

第二种情况

原对象的属性有值,复制时指定某些字段不复制

调BeanUtils的这个方法

public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {        copyProperties(source, target, null, ignoreProperties);    }
 public static void main(String[] args) {        TopMenuConfigEntity topMenuConfigEntity1 = new TopMenuConfigEntity();        topMenuConfigEntity1.setWardCode("cat");        topMenuConfigEntity1.setTitle("animal");        topMenuConfigEntity1.setCreateTime(new Date());        TopMenuConfigEntity topMenuConfigEntity2 = new TopMenuConfigEntity();        String[] ignoreArray = new String[]{"title","createTime"};        BeanUtils.copyProperties(topMenuConfigEntity2,topMenuConfigEntity1,ignoreArray);        System.out.println("title : "+topMenuConfigEntity2.getTitle() +";createTime :" + topMenuConfigEntity2.getCreateTime());    }

topMenuConfigEntity2的title 和createTime为null,没有复制

BeanUtils.copyProperties()的用法和注意点

属性为null也会被复制,内部类不会复制过去

BeanUtils提供对Java反射和自省api的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。

该方法源码如下:

public static void copyProperties(Object source, Object target) throws BeansException {        copyProperties(source, target, (Class)null, (String[])null);    } public static void copyProperties(Object source, Object target, Class<?> editable) throws BeansException {        copyProperties(source, target, editable, (String[])null);    } public static void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException {        copyProperties(source, target, (Class)null, ignoreProperties);    } private static void copyProperties(Object source, Object target, Class<?> editable, String... ignoreProperties) throws BeansException {        Assert.notNull(source, "Source must not be null");        Assert.notNull(target, "Target must not be null");        Class<?> actualEditable = target.getClass();        if(editable != null) {            if(!editable.isInstance(target)) {                throw new IllegalArgumentException("Target class [" + target.getClass().getName() + "] not assignable to Editable class [" + editable.getName() + "]");            }             actualEditable = editable;        }         PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);        List<String> ignoreList = ignoreProperties != null?Arrays.asList(ignoreProperties):null;        PropertyDescriptor[] var7 = targetPds;        int var8 = targetPds.length;         for(int var9 = 0; var9 < var8; ++var9) {            PropertyDescriptor targetPd = var7[var9];            Method writeMethod = targetPd.getWriteMethod();            if(writeMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());                if(sourcePd != null) {                    Method readMethod = sourcePd.getReadMethod();                    if(readMethod != null && ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {                        try {                            if(!Modifier.isPublic(readMethod.getDeclarinGClass().getModifiers())) {                                readMethod.setAccessible(true);                            }                             Object value = readMethod.invoke(source, new Object[0]);                            if(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {                                writeMethod.setAccessible(true);                            }                             writeMethod.invoke(target, new Object[]{value});                        } catch (Throwable var15) {                            throw new FatalBeanException("Could not copy property '" + targetPd.getName() + "' from source to target", var15);                        }                    }                }            }        }     }

如果你有两个具有很多相同属性的JavaBean,就可以试用该方法将sourse中的属性copy到target中,如果sourse和target间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。

怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。

BeanUtils支持的转换类型如下:

* java.lang.BigDecimal     * java.lang.BigInteger     * boolean and java.lang.Boolean     * byte and java.lang.Byte     * char and java.lang.Character     * java.lang.Class     * double and java.lang.Double     * float and java.lang.Float     * int and java.lang.Integer     * long and java.lang.Long     * short and java.lang.Short     * java.lang.String     * java.sql.Date     * java.sql.Time     * java.sql.Timestamp

这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用。

注意点一

apache和spring的工具包中都有BeanUtils,使用其中的copyProperties方法可以非常方便的进行这些工作,但在实际应用中发现,对于null的处理不太符合个人的需要,例如在进行修改操作中只需要对model中某一项进行修改,那么一般我们在页面上只提交model的ID及需要修改项的值,这个时候使用BeanUtils.copyProperties会将其他的null绑定到pojo中去。

大家可以直接调用我们加工类的copyPropertiesIgnoreNull()方法即可忽略null值,避免老数据被null覆盖的尴尬。具体代码如下:

import org.springframework.beans.BeanUtils;import org.springframework.beans.BeanWrapper;import org.springframework.beans.BeanWrapperImpl;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware; import java.util.HashSet;import java.util.Set; public class SpringUtil implements ApplicationContextAware {           private static ApplicationContext applicationContext;             @Override      public void setApplicationContext(ApplicationContext arg0)              throws BeansException {          applicationContext = arg0;      }             public static Object getObject(String id) {          Object object = null;          object = applicationContext.getBean(id);          return object;      }         public static String[] getNullPropertyNames (Object source) {        final BeanWrapper src = new BeanWrapperImpl(source);        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();         Set<String> emptyNames = new HashSet<String>();        for(java.beans.PropertyDescriptor pd : pds) {            Object srcValue = src.getPropertyValue(pd.getName());            if (srcValue == null) emptyNames.add(pd.getName());        }        String[] result = new String[emptyNames.size()];        return emptyNames.toArray(result);    }     public static void copyPropertiesIgnoreNull(Object src, Object target){        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));    } }

调用:copyPropertiesIgnoreNull

public class TestBeanUtiles {    public static void main(String[] args) {        NewPerson newPerson = new NewPerson();        newPerson.setName("bifuguo");//前台用户更新过的数据,例如前台只修改了用户名        //下面我们假设是从数据库加载出来的老数据        OldPerson oldPerson = new OldPerson();        oldPerson.setSex("nv");        oldPerson.setAge(5);        //如果我们想把新数据更新到老数据这个对象里面,我们就可以借助BeanUtils.copyProperties()的方法如下:        //BeanUtils.copyProperties(newPerson, oldPerson);        SpringUtil.copyPropertiesIgnoreNull(newPerson, oldPerson);        System.out.println(newPerson.toString());        System.out.println(oldPerson.toString());    }}

打印结果:

NewPerson{name='bifuguo', sex='null', age=0}
OldPerson{name='bifuguo', sex='nv', age=0}

现在就可以看出老数据没有被null覆盖

注意点二

Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法;

如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;

泛型只在编译期起作用,不能依靠泛型来做运行期的限制;

最后,spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。

读到这里,这篇“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: BeanUtils.copyProperties()所有的空值不复制问题怎么解决

本文链接: https://www.lsjlt.com/news/340934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • BeanUtils.copyProperties()所有的空值不复制问题怎么解决
    本文小编为大家详细介绍“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”文章能...
    99+
    2023-07-02
  • BeanUtils.copyProperties()所有的空值不复制问题
    目录BeanUtils.copyProperties()所有的空值不复制第一种情况第二种情况BeanUtils.copyProperties()的用法和注意点属性为null也会被复制...
    99+
    2024-04-02
  • 解决BeanUtils.copyProperties不支持复制集合的问题
    工作中,经常使用Spring的工具类BeanUtils.copyProperties对bean属性进行复制,这里的复制属于浅复制。且不能复制集合和数组。本文会对该工具进行一些测试。 ...
    99+
    2024-04-02
  • BeanUtils.copyProperties复制不生效的解决
    目录前言问题的排查问题的扩展前言 呵呵 前端时间使用 BeanUtils.copyProperties 的时候碰到了一个这样的问题 我有两个实体, 有同样的属性, 一个有给定的属性的...
    99+
    2024-04-02
  • BeanUtils.copyProperties复制对象结果为空怎么解决
    这篇文章主要介绍“BeanUtils.copyProperties复制对象结果为空怎么解决”,在日常操作中,相信很多人在BeanUtils.copyProperties复制对象结果为空怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好...
    99+
    2023-07-02
  • CSS值复制问题怎么解决
    这篇文章主要介绍了CSS值复制问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS值复制问题怎么解决文章都会有所收获,下面我们一起来看看吧。 如何使用值复制。 ...
    99+
    2024-04-02
  • java中使用BeanUtils.copyProperties方法对象复制同名字段类型不同赋值为空问题解析
    项目场景: 对象之间的复制,dto对象中字段类型为String,model中字段类型为BigDecimal。使用BeanUtils.copyProperties方法进行对象批量复制。 问题描述 提示:这里描述项目中遇到的问题: 使用Spr...
    99+
    2023-08-17
    java 开发语言
  • 解决Beanutils.copyproperties实体类对象不一致的问题
    今天给大家分析一个解决Beanutils.copyproperties实体类对象名不一致的解决方法,一般我们在两个对象拷贝的问题上,我个人用的比较多的就是Beanutils.copy...
    99+
    2024-04-02
  • Mybatis saveAndUpdate空值不更新问题及解决
    目录Mybatis saveAndUpdate空值不更新Mybatis使用update更新值为null时不生效出现的问题原因解决方法总结Mybatis saveAndUpdate空值...
    99+
    2023-02-08
    Mybatis saveAndUpdate saveAndUpdate空值不更新 Mybatis saveAndUpdate空值
  • java空间不足问题怎么解决
    1. 增加JVM内存:可以通过设置JVM参数来增加JVM内存,例如-Xmx和-Xms参数。可以通过增加堆内存大小来提高应用程序性能和...
    99+
    2023-06-14
    java空间 空间
  • 怎么解决php cookie取不到值的问题
    这篇文章给大家分享的是有关怎么解决php cookie取不到值的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php cookie取不到值的解决办法:1、设置“setcookie('a',&#...
    99+
    2023-06-15
  • Linux开启SSH后没有限制Limit值问题怎么解决
    这篇文章主要讲解了“Linux开启SSH后没有限制Limit值问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux开启SSH后没有限制Limit值问题怎么解决”吧!  解决方...
    99+
    2023-06-13
  • Java反射机制如何解决数据传值为空的问题
    目录反射机制数据传值为空的问题java 反射 处理 空值反射机制数据传值为空的问题 两个小方法,用于解决BeanUtils.copyProperties(x, y);中源对象的值为空...
    99+
    2024-04-02
  • Mybatis-Plus中updateById方法不能更新空值问题解决
    目录问题描述演示:原因分析:解决方案:1、设置字段级别的更新策略IGNORED2、设置全局更新策略IGNORED3、采用alwaysUpdateSomeColumnById方法进行全...
    99+
    2022-11-13
    Mybatis-Plus updateById空值 Mybatis-Plus updateById更新空值
  • 怎么解决oracle11g空表不能exp导出的问题
    这篇文章主要介绍“怎么解决oracle11g空表不能exp导出的问题”,在日常操作中,相信很多人在怎么解决oracle11g空表不能exp导出的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • php复选数组有空值报错怎么解决
    在处理php复选数组中可能存在空值的情况时,可以使用以下方法来解决错误: 使用isset()函数检查每个数组元素是否存在,如果不存...
    99+
    2023-10-27
    php
  • 怎么解决Linux中“磁盘空间不足”的问题
    这篇文章主要介绍“怎么解决Linux中“磁盘空间不足”的问题”,在日常操作中,相信很多人在怎么解决Linux中“磁盘空间不足”的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决Linux中“磁盘空间...
    99+
    2023-06-16
  • 怎么解决php curl没有返回值的问题
    本篇内容介绍了“怎么解决php curl没有返回值的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php curl没有返回值的解决办法:...
    99+
    2023-06-22
  • 如何解决xp不能复制粘贴问题
    小编给大家分享一下如何解决xp不能复制粘贴问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!无法使用复粘贴功能,可以用注册表修复,注册表是系统的核心部分,所以操作时为谨慎。修复方法,先进入注册表,从开始菜单中打开“运行”程...
    99+
    2023-06-28
  • vue前端传空值、空字符串的问题及解决
    目录vue前端传空值及空字符串问题vue空值报错问题vue前端传空值及空字符串问题 在与后端调试接口时,经常接口里的参数会有空值,如果每次都要后端写判断,代码容易冗余。  ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作