BeanUtils拷贝属性容易忽视的坑
2017-05-13 12:31
162 查看
使用BeanUtils对两个对象进行属性拷贝(浅拷贝),方便快捷,减少了开发量,提高了开发效率,但是使用的时候要着重考虑下此处是否真的能用。
例如:
用test1的属性覆盖test2的属性,但是当test1某属性为null时,我不希望test2的属性值丢失,相信这种场景大家也会经常遇到,比如前端修改一个对象,把修改后的对象传到后台,后台需要用这个对象更新持久层的实体,但是前端通常不可能将持久层实体涉及的所有属性都传到后台(因为有些属性是对前端屏蔽的,前端根本拿不到),这个时候如果使用BeanUtils直接拷贝,那么恭喜你,你的持久层数据被更新坏了
那么为什么会出现这个问题呢,我们以org.springframework.beans.BeanUtils为例,看下它的源码是如何实现的
第一个红框校验了源对象中是否有目标对象中需要更新的某属性,如果有就往下执行了
第二个红框从原对象中把该属性值取出,然后设置到目标对象中相应属性上
对比了其他几种BeanUtils源码(此处就不贴了),大体上都是这个思路,并不会检查原对象的属性是否为null,我想这可能是因为BeanUtils拷贝属性的设计初衷就是null也是一种属性值的状态,但是我们在使用的时候一定要根据自己的使用场景,谨慎使用!谨慎使用!谨慎使用!
例如:
public class TestCopy { public static void main(String[] args) { Test test1 = new Test(); Test test2 = new Test(); test1.setA("a1"); // test1.setB(1f); test2.setA("a2"); test2.setB(2f); BeanUtils.copyProperties(test1, test2); System.out.println(test2.getA()); System.out.println(test2.getB()); } } class Test { private String a; private Float b; public String getA() { return a; } public void setA(String a) { this.a = a; } public Float getB() { return b; } public void setB(Float b) { this.b = b; } }
用test1的属性覆盖test2的属性,但是当test1某属性为null时,我不希望test2的属性值丢失,相信这种场景大家也会经常遇到,比如前端修改一个对象,把修改后的对象传到后台,后台需要用这个对象更新持久层的实体,但是前端通常不可能将持久层实体涉及的所有属性都传到后台(因为有些属性是对前端屏蔽的,前端根本拿不到),这个时候如果使用BeanUtils直接拷贝,那么恭喜你,你的持久层数据被更新坏了
那么为什么会出现这个问题呢,我们以org.springframework.beans.BeanUtils为例,看下它的源码是如何实现的
第一个红框校验了源对象中是否有目标对象中需要更新的某属性,如果有就往下执行了
第二个红框从原对象中把该属性值取出,然后设置到目标对象中相应属性上
对比了其他几种BeanUtils源码(此处就不贴了),大体上都是这个思路,并不会检查原对象的属性是否为null,我想这可能是因为BeanUtils拷贝属性的设计初衷就是null也是一种属性值的状态,但是我们在使用的时候一定要根据自己的使用场景,谨慎使用!谨慎使用!谨慎使用!
相关文章推荐
- BeanUtils.copyProperties拷贝bean属性的时候属性为空
- Spring 的BeanUtils.copyProperties在拷贝属性时忽略空值
- JavaBean中通过自省机制拿到对应的属性和方法,以及BeanUtils工具类中的拷贝属性方法
- [WPF 容易忽视的细节] —— x:Name与Name属性
- UIScollView容易被忽视的属性
- 扩展spring的BeanUtils,增加拷贝属性排除null值的功能(注:String为null不考虑)
- WCF中容易忽视的ConfigurationName属性
- BeanUtils.copyProperties属性拷贝日期为空异常
- Jakarta Commons BeanUtils 拷贝bean属性
- BeanUtils拷贝两个对象的相同属性
- Apache BeanUtils 拷贝属性的实现
- org.apache.commons.beanutils.BeanUtils 拷贝属性为对象的属性,拷贝地址
- HTML <link> 标签中容易被忽视的 media 属性
- Jakarta Commons学习笔记 [BeanUtils] 拷贝bean属性
- java对象拷贝之BeanUtils.copyProperties() 用法
- 容易忽视的一些细节
- 一个容易忽视的Oracle数据安全问题
- 那些容易被忽视但又非常重要的安全知识
- jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
- 记录一些容易忘记的属性 -- NSTimer