使用BeanUtils.copyProperties引发的问题

在Java开发中,使用Spring的BeanUtils.copyProperties进行对象转换时,可能会遇到属性丢失和对象浅拷贝问题。本文通过实例分析了BeanUtils.copyProperties在处理泛型属性时的限制,以及浅拷贝导致的对象共享问题。并探讨了解决方案,包括手动设置属性、使用其他Bean拷贝工具以及实现深拷贝的clone方法和序列化方法。
摘要由CSDN通过智能技术生成

概述
对象之间的转换在开发中是最常见的,实体对象和数据显示层(VO,DTO等)的转换,通常有 2 种做法:

set 方法赋值,这种方式一般使得代码冗余,而且极不美观;
对象拷贝工具类,如 Spring 的 BeanUtils.copyProperties 。
而我最近在使用 Spring 的拷贝工具类的时候碰到了属性值丢失的情况,先看这样一个栗子。

订单实体类到 VO 层的转换:

转换后的结果如下:

从上面可以看到 2 个问题:

对象 copy 后没有 id 并没有赋值;
VO 对象的改变影响了原订单的值。
问题一
先看第 1 个问题。

一般在项目开发中会把实体类中一些公共的字段(如 id,创建日期等)抽为一个公共的实体,如下:

BaseEntity

可以看到这里的BaseEntity中定义的 id 是一个泛型,因为在项目中有 2 中主键类型,一种是 String 类型的,一种是 Long 类型的,如下:

LongBaseEntity,主键为 Long 类型的,实体类主键若为Long,继承它即可。

UUIDBaseEntity,主键为 String 类型的,实体类主键若为 String ,继承它即可。

而订单类如下,一般来说这里不会存在其他对象,这里订单详情的目的仅仅是为了演示上面的第二个问题。

订单详情:

数据展示 VO:

然后当我把 TicketOrder 转为 TicketOrder

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值