美文网首页
《记属性拷贝的一次坑》

《记属性拷贝的一次坑》

作者: 风居住的街道_83df | 来源:发表于2021-05-01 12:08 被阅读0次

在spring项目中,有多种不同的O,DTO 、DO、VO等等,不同层使用不同的O。在不同层之间传输时可能会进行不同O之间的转化。所以写对象之间的转化的代码是有必要,但又无聊的,特别是当对象涉及到特别多的属性。所以牛人们开发出自动生成set和get的插件:generateAllSetter。使用起来也是比较简单的,例如:现在有两个Bean,BeanVO和BeanDTO属性是一致的,都有三个String类型的属性,变量名相同。

(以将DTO转VO为例)自动生成代码步骤就是:首先构建一个如下的函数:

private BeanVO toBeanVo(BeanDTO beanDTO) {

}

函数返回类型是BeanVO,函数入参是BeanDTO,接着使用组合按键: Alt + Enter ,会弹出来下面的选项:

接着选中就会自动生成代码:

当对象属性特别多的时候且公司要求手写不能使用对象拷贝工具类的时候,这个插件的价值就体现出来了~


当公司允许使用对象拷贝工具类时,为了代码的简洁美化,工具类也是不错的。以spring的BeanUtils为例:

上述方式可以直接改为:

BeanUtils.copyProperties(beanVO, beanDTO);

确实挺方便的,但这里有一个坑,当beanDTO拷贝到beanVO时,如果beanDTO的某个属性是null,且beanVO中也有这个属性时,无论beanVO这个属性是否有值,都会被设置为null

以下举例:

a对象的address一开始拷贝到c对象的,第一次输出也是正常有值的。b对象的address是null,在将b凯贝到c对象时,将原来的值给设置为b中address了,所以第二次输出是null。

来打断点看一下:断点处:BeanUtils.copyProperties(b, c);

可以看到整个拷贝的步骤是,首先获取C所有的属性,对于每一个属性都去B中检索,如果存在则将b对象中这个属性的值,通过c的set方法写入到c对象中。

解决上述问题,可以通过先将a拷贝给b,接着再将b拷贝给c,就不会出现null覆盖原有的不为null的属性了。见图

当然也可以改写这个方法,判断b中的属性不为null时再执行invoke方法,写入到c对象。

相关文章

  • 《记属性拷贝的一次坑》

    在spring项目中,有多种不同的O,DTO 、DO、VO等等,不同层使用不同的O。在不同层之间传输时可能会进行不...

  • 深度拷贝(递归拷贝)

    深度拷贝 拷贝出来的和被拷贝的没有关系,即被拷贝的属性改变,拷贝出来的属性不会跟着改变。

  • 2020-11-17

    浅拷贝,深拷贝针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值...

  • 15.深浅拷贝

    浅拷贝:就是当被拷贝的对象的某个属性值为引用类型时,拷贝的对象会将被拷贝的对象的这个属性的引用的地址拷贝过来,这样...

  • JAVA设计模式:原型模式与拷贝

    深拷贝与浅拷贝 浅拷贝:对象A进行赋值操作得到对象B,这就是浅拷贝,修改对象A的属性会影响到B的属性 深拷贝:深拷...

  • 属性拷贝

    public class DataTransformUtil {public static

  • 简单|就好

    记一次蜀山之行…………【坑】

  • 深拷贝和浅拷贝

    什么是深拷贝和浅拷贝 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的...

  • 深浅拷贝

    浅拷贝 {...a},es6语法,将a对象的属性进行浅层拷贝 深拷贝

  • 集合深浅拷贝以及经常遇到的坑(面试常问)

    集合深浅拷贝以及经常遇到的坑(面试常问) 集合深浅拷贝以及经常遇到的坑(面试常问)

网友评论

      本文标题:《记属性拷贝的一次坑》

      本文链接:https://www.haomeiwen.com/subject/yasarltx.html