在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对象。

网友评论