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

作者:葫芦胡 时间:2022-07-11 05:22:04 

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 之前。

来源:https://blog.csdn.net/HXNLYW/article/details/101713660

标签:BeanUtils,copyProperties,忽略,空值
0
投稿

猜你喜欢

  • springboot集成opencv实现人脸识别功能的详细步骤

    2023-10-07 00:38:22
  • 完美解决虚拟按键遮盖底部视图的问题

    2021-11-24 23:48:25
  • springboot如何使用AOP做访问请求日志

    2023-11-11 10:12:19
  • 详解Spring MVC CORS 跨域

    2023-11-25 08:04:37
  • C# Winform调用百度接口实现人脸识别教程(附源码)

    2021-12-27 13:17:09
  • Java实现简单的迷宫游戏详解

    2022-11-22 05:00:52
  • VS2010+Opencv+MFC读取图像和视频显示在Picture控件

    2023-09-28 03:39:07
  • Java标识接口的使用方法

    2021-12-24 02:54:14
  • 浅谈Java 三种方式实现接口校验

    2023-01-20 02:57:55
  • C#关键字async/await用法

    2022-04-19 03:38:13
  • 实例分析java中重载与重写的区别

    2021-09-11 01:49:38
  • Java 入门图形用户界面设计之单选按钮

    2023-08-29 13:40:02
  • 高可用架构etcd选主故障主备秒级切换实现

    2022-08-08 23:40:48
  • 基于C#实现网络爬虫 C#抓取网页Html源码

    2022-11-16 22:19:05
  • java中超过long范围的超大整数相加算法详解(面试高频)

    2022-09-15 11:22:05
  • java Quartz定时器任务与Spring task定时的几种实现方法

    2021-11-14 22:31:47
  • SpringMVC Restful api接口实现的代码

    2023-11-29 12:34:27
  • Android自定义ViewPagerIndicator实现炫酷导航栏指示器(ViewPager+Fragment)

    2021-11-05 13:16:12
  • Flutter应用框架搭建实现屏幕适配方案详解

    2023-09-19 08:16:27
  • Android实现后台服务拍照功能

    2022-11-07 03:30:50
  • asp之家 软件编程 m.aspxhome.com