类属性转换 拷贝 赋值

参考链接  https://www.cnblogs.com/CodeBlogMan/p/18005657

 

三、类属性转换

在实际 Java 开发中,关于 VO、Entity、DTO 等对象属性之间的赋值是我们经常遇见的,最简单使用 @Data 去逐个 .set() 或者 @Builder 链式 .build(),其实都是很靠谱的办法,而且可以控制颗粒度。但属性一多起来的话,比如二十个以上,那么代码就会显得很长。所以有没有办法一行代码就搞定类属性转换呢?

首先不推荐使用 BeanUtils.copyProperties() 作类属性的拷贝,以下是几个常见的坑:

  1. 同一字段分别使用包装类型和基本类型,会出现转换异常,不会灵活识别转换
  2. null 值覆盖导致数据异常,即源属性有值为 null,但是目标属性有正常值,拷贝后会被 null 覆盖
  3. 内部类属性无法正常拷贝,即使类型和字段名均相同也无法拷贝成功,这个真的很坑

推荐泛型 + 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);
        }
posted @ 2024-02-13 16:38  予真  阅读(11)  评论(0编辑  收藏  举报