接上篇:https://developer.aliyun.com/article/1228288?groupCode=java
四、 泛型属性拷贝
Spring的BeanUtils.copyProperties方法,是一个很好用的属性拷贝工具方法。
1. 问题现象
根据数据库开发规范,数据库表格必须包含id,gmt_create,gmt_modified三个字段。其中,id这个字段,可能根据数据量不同,采用int或long类型。
首先,定义了一个BaseDO基类:
针对user表,定义了一个UserDO类:
对于查询接口,定义了一个UserVO类:
实现查询用户服务接口,实现代码如下:
通过测试,我们会发现一个问题——调用查询用户服务接口,用户ID的值并没有返回。
2. 问题分析
通过Debug模式运行,进入到BeanUtils.copyProperties工具方法内部,得到以下内容:
原来,UserDO类的getId方法返回类型不是Long类型,而是被泛型还原成了Object类型。而下面的ClassUtils.isAssignable工具方法,判断是否能够把Object类型赋值给Long类型,当然会返回false导致不能进行属性拷贝。
为什么作者不考虑“先获取属性值,再判断能否赋值”?建议代码如下:
3. 避坑方法
1) 不要盲目地相信第三方工具包,任何工具包都有可能存在问题
在Java中,存在很多第三方工具包,比如:Apache的commons-lang3、commons-collections,Google的guava……都是很好用的第三方工具包。但是,不要盲目地相信第三方工具包,任何工具包都有可能存在问题。
2) 如果需要拷贝的属性较少,可以手动编码进行属性拷贝
用BeanUtils.copyProperties反射拷贝属性,主要优点是节省了代码量,主要缺点是导致程序性能下降。所以,如果需要拷贝的属性较少,可以手动编码进行属性拷贝。
接下篇:https://developer.aliyun.com/article/1228286?spm=a2c6h.13148508.setting.23.7be64f0ebemzoR