参考链接 https://www.cnblogs.com/CodeBlogMan/p/18005657
三、类属性转换
在实际 Java 开发中,关于 VO、Entity、DTO 等对象属性之间的赋值是我们经常遇见的,最简单使用 @Data 去逐个 .set() 或者 @Builder 链式 .build(),其实都是很靠谱的办法,而且可以控制颗粒度。但属性一多起来的话,比如二十个以上,那么代码就会显得很长。所以有没有办法一行代码就搞定类属性转换呢?
首先不推荐使用 BeanUtils.copyProperties() 作类属性的拷贝,以下是几个常见的坑:
- 同一字段分别使用包装类型和基本类型,会出现转换异常,不会灵活识别转换
- null 值覆盖导致数据异常,即源属性有值为 null,但是目标属性有正常值,拷贝后会被 null 覆盖
- 内部类属性无法正常拷贝,即使类型和字段名均相同也无法拷贝成功,这个真的很坑
推荐泛型 + JSON组合的方式来实现类属性的转换,具体步骤如下:
-
定义一个父类 CommonBean,让项目里所有 VO、Entity、DTO 等类都继承该类,类里面就只定义一个公共的泛型方法即可:
public class CommonBean implements Serializable { /** * @apiNote 全局类型转换方法:入参和返参均支持泛型 * @param target * @return 目标类型 * @param <T> */ public <T> T copyProperties(Class<T> target) { //本质上就是进行了 Object -> json字符串 -> 到指定类型的转换 return JSON.parseObject(JSON.toJSONString(this), target); } }
-
在需要转换的地方,直接调用上面定义的方法即可完成转换:
@Test public void testCopyProperties(){ //Worker 和 WorkerVO 都需要 extends 上述的 CommonBean Worker worker = new Worker(); worker.setName("Alex"); worker.setStatus(NumberUtils.INTEGER_ONE); //直接使用,得到需要的目标 VO 对象 WorkerVO workerVO = worker.copyProperties(WorkerVO.class); log.info("转换结果:{}",workerVO); }