BeanUtils.copyProperties在拷贝属性时忽略空值的操作

 更新时间:2021年06月16日 10:08:55   作者:葫芦胡  
这篇文章主要介绍了BeanUtils.copyProperties在拷贝属性时忽略空值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

BeanUtils.copyProperties忽略空值

使用spring开发的人,对这行代码肯定不陌生,常用于DTO、VO、PO之间的复制。

/**
* 全属性copy对象
* 
**/
BeanUtils.copyProperties(Object source, Object target)

但这行代码会将所有的属性都进行copy,有的时候我们想要个别属性不进行复制(比如:null值属性),这时就需要用到另一个方法:

/**
* 忽略某些属性copy对象
* 
**/
BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)

第三个参数是可变长类型,动态获取忽略的属性:

/**
 * 获取需要忽略的属性
 * 
 * @param source
 * @return
 */
public static String[] getNullPropertyNames (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());
        }
    }
    String[] result = new String[emptyNames.size()];
    return emptyNames.toArray(result);
}

拓展一下下:

很多时候我们需要将Map与Bean之间转换,提供两种方式:

一、使用fastjson

1、map转bean:

Map paramMap = new HashMap();
String jsonStr = JSONObject.toJSONString(paramMap);
Object infoDo = JSON.parseObject(jsonStr, Object.class);

2、bean转map:

Map<String, Object> map = JSON.parseObject(JSON.toJSONString(object),new TypeReference<Map<String,Object>>(){});

二、使用commons-beanutils

依赖包:

<dependency>
 <groupId>commons-beanutils</groupId>
 <artifactId>commons-beanutils</artifactId>
 <version>1.8.3</version>
</dependency>

然后调用方法:

/**
 * Bean转map
 * 
 * @param bean
 * @return
 */
public Map describe(Object bean);
 
/**
 * map转bean
 * 
 * @param bean
 * @param map
 */
public void populate (Object bean, Map map);

同时可以按指定的属性列表copy对象:

/**
 * 按指定的属性列表赋值对象
 *
 * @param source
 * @param target
 * @param properties
 *
 */
public static void copyWithProperties(Object source, Object target, List<String> properties) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
    for (String property : properties) {
        PropertyUtils.setProperty(target, property, PropertyUtils.getProperty(source, property));
    }
}

BeanUtils 在复制类时需要注意 值为空的情况

BeanUtils.copyProperties(dest, orig);

此处引用的是 org.apache.commons.beanutils.BeanUtils;

ConvertUtils.register(new DateConverter(null), java.util.Date.class);

添加这一行代码,解决date 类型为空 报错

ConvertUtils.register(new IntegerConverter(null), Integer.class);

这一行,可以解决 integer值为空时不自动赋值为0;

另外 double 可能也很特殊,我没研究。

注意这些后加的条件要放在BeanUtils.copyProperties 之前。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringCloud集成zookeeper实现服务注册并访问功能

    SpringCloud集成zookeeper实现服务注册并访问功能

    zookeeper和eureka一样,是用于充当服务注册功能服务器的一个springcloud插件,这篇文章主要介绍了SpringCloud集成zookeeper实现服务注册并访问,需要的朋友可以参考下
    2022-06-06
  • java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有大小,当池子体积不够承载时,就涉及到拒绝策略。JDK中已预设了 4 种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景以及还能扩展哪些拒绝策略
    2021-11-11
  • Java 定时器(Timer,TimerTask)详解及实例代码

    Java 定时器(Timer,TimerTask)详解及实例代码

    这篇文章主要介绍了 Java 定时器(Timer,TimerTask)详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • 带你一文深入认识Java String类

    带你一文深入认识Java String类

    这篇文章主要介绍了带你一文深入认识Java String类,String 类在Java中是很常用的类,很重要的类,在后续的学习中经常会用到,是后续学习的基础, 文章围绕主题展开更多详细内容,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-06-06
  • 简单了解JAVA构造方法

    简单了解JAVA构造方法

    构造方法作用就是对类进行初始化。 如果你没有定议任何构造方法的形式,程式会为你取一个不带任何参数的构造函数,那么你产生类的对像时只能用不带参数的方法.下面小编和大家来一起学习一下吧
    2019-06-06
  • spring boot3整合AI组件及使用方法

    spring boot3整合AI组件及使用方法

    本文介绍了springboot开发后端服务中,AI组件(Spring AI)的整合与使用,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Mybatis 中的一对一,一对多,多对多的配置原则示例代码

    Mybatis 中的一对一,一对多,多对多的配置原则示例代码

    这篇文章主要介绍了 Mybatis 中的一对一,一对多,多对多的配置原则示例代码,需要的朋友可以参考下
    2017-03-03
  • 解决mybatisPlus 中的field-strategy配置失效问题

    解决mybatisPlus 中的field-strategy配置失效问题

    这篇文章主要介绍了解决mybatisPlus 中的field-strategy配置失效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java去掉小数点后面无效0的方案与建议

    Java去掉小数点后面无效0的方案与建议

    当前小数点后面的位数过多的时候,多余的0没有实际意义,下面这篇文章主要给大家介绍了关于Java去掉小数点后面无效0的方案与建议,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 通过Spring Boot配置动态数据源访问多个数据库的实现代码

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    这篇文章主要介绍了通过Spring Boot配置动态数据源访问多个数据库的实现代码,需要的朋友可以参考下
    2018-03-03

最新评论