BeanUtils.copyProperties在拷贝属性时忽略空值的操作
作者:葫芦胡 发布时间:2022-07-11 05:22:04
标签: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 之前。
来源:https://blog.csdn.net/HXNLYW/article/details/101713660


猜你喜欢
- 为了方便客户抓取Log,现通过TCP协议连接指定服务器,传输指定内容,定义指定目录,IP,PORT字段接收参数。直接上代码 public s
- 场景:PageHelper 的默认分页方案是 select count(0) from (你的sql) table_count由于查询数据比
- java导出Excel通用方法的实例详解Java导出Excel通用方法,只需要一个list 集合。通用方法改进之处踊跃提出package o
- 本文实例为大家分享了Android实现滚动日期选择器的具体代码,供大家参考,具体内容如下wheelview滚动效果的View这段时间需要用到
- ArrayList中存放引用数据类型ArrayList中存放引用类型时,存放的是一个引用,因此在放入ArrayList之后再进行改动会影响到
- 目录一、事出有因二、解决方案困境三、柳暗花明,终级解决方案第一种实现方案第二种实现方案第三种实现方案四、引发的思考一、事出有因最近有一个场景
- 前言反射和注解在java中偏高级用法,一般在各种框架中被广泛应用,文章简单介绍下反射和注解的用法,希望对你的工作学习有一定帮助java注解什
- 先写在前面,这说的Settings加载选项是指Settings这个应用显示在主界面的选项,这个修改需要对系统源码进行修改。Android 7
- 前言在C语言中,没有专门用来表示字符串的类型。C语言的字符串是一系列以’\0’为结尾的字符的集合。虽
- 一.使用场景一次请求需要往数据库插入多条数据时,可以节省大量时间,mysql操作在连接和断开时的开销超过本次操作总开销的40%。二.实现方法
- 前言循环语句为众多程序员们提供了很大的便利,有while、do...while、for和 foreach。而且foreach语句很简洁,但是
- mybatis-plus 3.0.1 枚举返回为null解决办法2020-11-02 14:28:48今天再次回到代码里无意间看到,原来和m
- 目录1. 应用场景1.1. 保障线程安全1.2. 显示传递参数2. 实现原理3. 注意事项ThreadLocal是线程私有的局部变量存储容器
- 一,在一个公共类里创建一个公共方法,然后需要验证的页面都调用这个方法 //在此例子中,就是在入口函数里调用CheckLogin()
- 1.BIO1.1 简述BIO是同步阻塞IO,所有连接都是同步执行的,在上一个连接未处理完的时候是无法接收下一个连接1.2 代码示例在上述代码
- 例子一,获取三小时前的记录public static DataTable Query(){const string sSql = "
- 1.创建阻塞的服务器当 ServerSocketChannel 与 SockelChannel 采用默认的阻塞模式时,为了同时处理多个客户的
- 1:什么是Socket所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信
- 效果图如下所示: 1、在Adapter中加入如下代码<pre style="background-color:#2
- 1、编写一个Java程序在屏幕上输出“你好!”。 //programme name Helloworld.java public class