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

BeanUtils.copyProperties的使用要导入:

org.springframework.beans.BeanUtils;
直接上代码:
package com.test;

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

上面的代码打印结果如下:

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

从上面我们可以看出,新的对象确实把修改的数据更新给老对象了,但是它却把原来为null或者int类型默认为0的值也都赋给了老对象,这肯定不合理的,下面我们自己写了一个加工类,大家可以直接调用我们加工类的copyPropertiesIgnoreNull()方法即可忽略null值,避免老数据被null覆盖的尴尬:

/**
* 版权所有 (c) 2018,中金支付有限公司  
*/
package com.yanshemiyue.system; 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; /**
* 类说明
*
* <pre>
* Modify Information:
* Author Date Description
* ============ =========== ============================
* houru 2018年1月4日 Create this file
* </pre>
*
*/ public class SpringUtil implements ApplicationContextAware { /**
* 当前IOC
*
*/
private static ApplicationContext applicationContext; /**
* * 设置当前上下文环境,此方法由spring自动装配
*
*/
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
applicationContext = arg0;
} /**
* 从当前IOC获取bean
*
* @param id
* bean的id
* @return
*
*/
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

package com.test;
import com.yxjr.system.SpringUtil;
public class TestBeanUtiles {
public static void main(String[] args) {
NewPerson newPerson = new NewPerson();
newPerson.setName("miyue");//前台用户更新过的数据,例如前台只修改了用户名
//下面我们假设是从数据库加载出来的老数据
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='miyue', sex='null', age=0}
OldPerson{name='miyue', sex='nv', age=0}

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

spring BeanUtils.copyProperties只拷贝不为null的属性的更多相关文章

  1. spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象)

    spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象) 它的出现原因: BeanUtils提供对Java反射和自省API的包装.其主要目的是利用 ...

  2. Spring、Commons的BeanUtils.copyProperties用法

    如果两个对象A.B的大部分属性的名字都一样,此时想将A的属性值复制给B,一个一个属性GET\SET代码量太大,可以通过复制属性的方式减小工作量,同时代码看起来更加简洁明了,复制属性可以用Spring或 ...

  3. BeanUtils.copyProperties()错误使用,给自己挖了坑

    场景:需要对某个集合中的所有元素拷贝到另一个集合中,想着BeanUtils.copyProperties()可以深拷贝对象,误以为也可以拷贝集合,于是乎写下了如下代码 List<CostRule ...

  4. BeanUtils.copyProperties缓解代码压力,释放双手

    简单描述:之前在写代码的时候,经常把表单提交到后台的对象的参数,通过getter方法取出来,然后,再通过setter方法传递给需要的对象,代码中写了很多get set这种方法,后来听同事说,sprin ...

  5. 吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个javabean之间的相互拷贝,自己写的就当是研究咯---https://www.cnblogs.com/NieXiaoHui/p/7150928.html

    吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个ja ...

  6. 基于 asm 实现比 spring BeanUtils 性能更好的属性拷贝框架

    Bean-Mapping 日常开发中经常需要将一个对象的属性,赋值到另一个对象中. 常见的工具有很多,但都多少不够简洁,要么不够强大. 我们经常使用的 Spring BeanUtils 性能较好,但是 ...

  7. 007-TreeMap、Map和Bean互转、BeanUtils.copyProperties(A,B)拷贝、URL编码解码、字符串补齐,随机字母数字串

    一.转换 1.1.TreeMap 有序Map 无序有序转换 使用默认构造方法: public TreeMap(Map<? extends K, ? extends V> m) 1.2.Ma ...

  8. BeanUtils.copyProperties()拷贝属性时,忽略空值

    把source的属性值复制给target的相同属性上,注意:双方需要复制的属性要有get.set方法 BeanUtils.copyProperties(source, target, PublicUt ...

  9. Spring BeanUtils 的对象复制 copyProperties

    Spring提供了一个非常棒的对象复制方法, 其参数的顺序和apache commons提供的同名方法是不一样的, 这个要小心. 源码 public static void copyPropertie ...

随机推荐

  1. Swift(二)基础部分

    数据类型 Swift 包含了 C 和 Objective-C 上所有基础数据类型.它还增加了 Objective-C 中没有的高阶数据类型比如元组(Tuple) 1.基础类型 Int整形和UInt无符 ...

  2. 腾讯地图JSAPI开发demo 定位,查询

    1.IP定位切换 2.点击坐标获取地点 3.查询地点切换坐标 <!DOCTYPE html> <html> <head> <meta http-equiv=& ...

  3. hive各种报错

    搭建了 CDH6.1.0环境 新加入一台机器都hive但是报错 javax.jdo.JDODataStoreException: Required table missing : "`VER ...

  4. 小黄车ofo法人被限制出境,它究竟还能撑多久?

    因为季节的原因,现在正是骑车的好时候,而且北京也开通了一条自行车的专用路.但就是在这么好的时候,我们发现,路边的小黄车却越来越少了,而且它的麻烦还不断! ofo法人被限制出境 6月12日消息,据上海市 ...

  5. Linux三剑客:grep、awk、sed

    ---------------------------------------------------------------------------------------------------- ...

  6. centos7 yum快速安装LNMP

    1.安装nginx yum install nginx ##开启nginx service nginx start 2.安装MYSQL yum localinstall http://dev.mysq ...

  7. Mongodb操作3-可视化工具使用

    1.无密码登录 1.创建连接 输入ip后 先测试在链接 2.有密码登录 设置密码 1.选择主数据库 >>>use admin # 第一步 选择主数据 switched to db a ...

  8. C语言|博客作业12—学期总结

    一.我学到的内容 二.我的收获 (1)https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/7603 收获:第一次接触C语言和写博客,感觉特别 ...

  9. 数组转list

    例如String数组转成Integer泛型的List String [] pathArr = deptPath.split(","); Lit<Integer> dep ...

  10. maven在eclipse运行命令和calss文件没有更新的问题

    使用Eclipse Maven插件[Run As]-[Maven build]时并未为其指定goal或phase 解决方法:  1.使用Eclipse Maven插件[Run As]-[Maven b ...