文章目录
- 场景还原
- 排查问题
- 原因分析
- 如何避免
- 其它bean拷贝工具对比
场景还原
beanutils.copyproperties (a,b)
a中有desc字段, b中也有desc ,可拷贝之后,b.desc 为null
排查问题
这里分析一种可能:
get set方法写错了,例如b中原先字段名为 testDesc,这时我们手动生成get set方法,
后来把testDesc字段改成了desc,但是get set 方法忘记了重新生成,就会造成这种情况。
同理 缺少get set方法也会导致这个问题
原因分析
原因就是截取字段错误 :
beanutils.copyproperties底层是通过两个实体类的 get方法名进行截取的
例如:方法名为 getTestDest ,subString 截取到的是testDesc
如何避免
开发中尽量避免类似的细节错误,有些比较好的方式:
- lombok 插件 加上@Data注解 自动生成get set 不用担心字段名改变
- 方法可以使用function参数,避免手写字段错误 如有疑惑可以搜索我的另一篇文章:
java 中的:: 双冒号 function参数
其它bean拷贝工具对比
bean拷贝不仅仅是beanutils.copyproperties一个工具类,
类似的有mapstruct工具 它和lomhok类似,是帮我们去编写class文件的
此外 还有比较常见工具Orika的mapperFactory 原理是通过javassist生成字节码
下面简单给三种工具做个对比分析:
对比 | beanUtils | mapstruct | mapperFactory |
优点 | 方便 ,基于springboot 无需额外引入包 ,不用额外写任何代码 | 运行阶段不受影响,效率最高 较少代码侵入,可以拷贝list ,支持不同字段名拷贝 | 效率较高 少量代码侵入 坑少 可以拷贝list ,支持不同字段名拷贝 |
缺点 | 效率低,拷贝功能有限 | 效率高是因为在编译时就帮我们生成了代码 但编译阶段修改了实体类字段需要重新编译maven 麻烦,如果忘记编译 较难排查 且新人很难分析出原因 且需要额外引包 | 需要额外引包 少量代码入侵到业务层 |
个人还是倾向于mapperFactory,因为拷贝功能较完善,mapstruct 虽然在运行阶段很流畅 但编写代码时真的很痛苦,没必要为了这点微乎其微的效率 浪费我们开发时间
orika mapperFactory 依赖:
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<!-- 博主用的 1.5.4 -->
<version>${orika.version}</version>
</dependency>
mapstruct 依赖:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
下面是的javassist依赖 感兴趣的同学可以自己尝试