《Java工程师必读手册》——Java经验之谈系列——那些年,我们踩过的那些Java坑(4)

简介: 《Java工程师必读手册》——Java经验之谈系列——那些年,我们踩过的那些Java坑(4)

接上篇:https://developer.aliyun.com/article/1228288?groupCode=java


四、 泛型属性拷贝

 

Spring的BeanUtils.copyProperties方法,是一个很好用的属性拷贝工具方法。

 

1. 问题现象

 

根据数据库开发规范,数据库表格必须包含id,gmt_create,gmt_modified三个字段。其中,id这个字段,可能根据数据量不同,采用int或long类型。

 

首先,定义了一个BaseDO基类:

 

image.png

 

针对user表,定义了一个UserDO类:

 

image.png 

 

对于查询接口,定义了一个UserVO类:

 

 

 

实现查询用户服务接口,实现代码如下:

 

image.png 

 

通过测试,我们会发现一个问题——调用查询用户服务接口,用户ID的值并没有返回。

 

image.png 

 

 

 

2. 问题分析

 

通过Debug模式运行,进入到BeanUtils.copyProperties工具方法内部,得到以下内容:

 

image.png 

 

原来,UserDO类的getId方法返回类型不是Long类型,而是被泛型还原成了Object类型。而下面的ClassUtils.isAssignable工具方法,判断是否能够把Object类型赋值给Long类型,当然会返回false导致不能进行属性拷贝。

 

为什么作者不考虑“先获取属性值,再判断能否赋值”?建议代码如下:

 

image.png 

 

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

相关文章
|
8天前
|
算法 Java
「译文」Java 垃圾收集参考手册(四):Serial GC
「译文」Java 垃圾收集参考手册(四):Serial GC
|
8天前
|
算法 Java PHP
「译文」Java 垃圾收集参考手册(一):垃圾收集简介
「译文」Java 垃圾收集参考手册(一):垃圾收集简介
|
7天前
|
NoSQL Dubbo Java
StringBoot编程式事务与声明式事务java工程师面试突击第一季
StringBoot编程式事务与声明式事务java工程师面试突击第一季
|
8天前
|
人工智能 Kubernetes Java
Java开发工程师如何紧跟技术前沿对于保持专业竞争力、提升工作效率以及适应行业发展?
【4月更文挑战第4天】Java开发工程师如何紧跟技术前沿对于保持专业竞争力、提升工作效率以及适应行业发展?
26 4
|
8天前
|
消息中间件 Dubbo Java
互联网 Java 工程师1000道面试题(485页)
互联网 Java 工程师1000道面试题(485页)
31 0
|
8天前
|
人工智能 监控 Java
招个Java工程师,却发现了一个宝藏平台
招个Java工程师,却发现了一个宝藏平台
30 0
招个Java工程师,却发现了一个宝藏平台
|
8天前
|
SQL 存储 Java
[Java]细节、经验
[Java]细节、经验
47 0
[Java]细节、经验
|
8天前
|
算法 安全 Java
「译文」Java 垃圾收集参考手册(三):GC 算法基础篇
「译文」Java 垃圾收集参考手册(三):GC 算法基础篇
|
8天前
|
算法 Java
「译文」Java 垃圾收集参考手册(五):Parallel GC
「译文」Java 垃圾收集参考手册(五):Parallel GC
|
8天前
|
算法 Java
「译文」Java 垃圾收集参考手册(六):Concurrent Mark and Sweep
「译文」Java 垃圾收集参考手册(六):Concurrent Mark and Sweep