使用BeanUtils.copyProperties引发的问题

概述

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

  1. set 方法赋值,这种方式一般使得代码冗余,而且极不美观;
  2. 对象拷贝工具类,如 Spring 的 BeanUtils.copyProperties 。

而我最近在使用 Spring 的拷贝工具类的时候碰到了属性值丢失的情况,先看这样一个栗子。

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

image-20211123204233625

转换后的结果如下:

image-20211123202748189

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

  1. 对象 copy 后没有 id 并没有赋值;
  2. VO 对象的改变影响了原订单的值。

问题一

先看第 1 个问题。

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

BaseEntity

image-20211123203203004

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

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

image-20211123203418354

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

image-20211123203609958

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

image-20211123203858982

订单详情:

image-20211123203831023

数据展示 VO:

image-20211123204416320

然后当我把 TicketOrder 转为 TicketOrderVO,发现 TicketOrder 的 id 并没有 copy 过来,致使到后续的逻辑无法走通ÿ

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LBXX_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值