文章目录

  • 场景还原
  • 排查问题
  • 原因分析
  • 如何避免
  • 其它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

如何避免

开发中尽量避免类似的细节错误,有些比较好的方式:

  1. lombok 插件 加上@Data注解 自动生成get set 不用担心字段名改变
  2. 方法可以使用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依赖 感兴趣的同学可以自己尝试

copyproperties 内存溢出 copyproperties 有null_java