对象复制哪些事情

开发中,我们需要将DO对象转换成VO这种时候一般都用BeanUtils.copyProperties();但是,实际情况中,会存在一种情况就是数据库类型和输出类型不同,名称意义相同的情况。

这个时候,有哪些方法可以方便我们处理这类情况呢?

方法一:BeanCopier

这个类来自cglib是一款比较底层的操作java字节码的框架。spring框架对他进行了简单的封装。

这里我们以org.springframework.cglib.beans.BeanCopier;简单演示下:

public class Test{
   public static void main(String[] args) {  
        Application application = new Application();
        //这里status是来自数据对象,类型是Integer
        application.setStatus(1);
        //response对象中也有个status属性,但是类型是String
        AppDetailResponse response = new AppDetailResponse();
        //采用常规的拷贝方法
        BeanUtils.copyProperties(application, response);
        //打印结果,status=null
        System.out.println(response.getStatus());
        //对比,我们使用BeanCopier,创建方式如下
        //源数据对象类型,目标对象类型,true表示使用自定义转换器
        //copy是真正的复制方法,第三个参数是自定义的转换器对象,需要自己写
        BeanCopier.create(Application.class, AppDetailResponse.class, true).copy(application, response, new MyConverter());
        //打印结果,status=1,转换成功
        System.out.println(response.getStatus());

   //我们自定义的转换器,规则很简单,可以加入自己的规则
   static class MyConverter implements Converter {
        @Override
        public Object convert(Object o, Class aClass, Object o1) {
            if (o instanceof String) {
                return o;
            } else if (o instanceof Integer){
                return o.toString();
            }
            return null;
        }
    }
}

进一步优化的方式,将自定义的MyConverter 方法作为全局Bean放在spring容器中,随时可以使用

方式二:可以对原来的BeanUtils的复制方法进行,定制化

参见:https://bbs.csdn.net/topics/399159725?list=73222373

方式三:通过JSON对象转换

这里的JSON转换工具类很多,我这里用net.sf.json.JSONObject;

public class Test{
   public static void main(String[] args) {  
        Application application = new Application();
        //这里status是来自数据对象,类型是Integer
        application.setStatus(1);
        //response对象中也有个status属性,但是类型是String
        AppDetailResponse response = new AppDetailResponse();
        //采用常规的拷贝方法
        BeanUtils.copyProperties(application, response);
        //打印结果,status=null
        System.out.println(response.getStatus());
        
        response = (AppDetailResponse)JSONObject.toBean(JSONObject.fromObject(application), AppDetailResponse.class);

        //打印结果,status=1,转换成功
        System.out.println(response.getStatus());


}

打印也是有值的。

不过有缺点:目标对象要和源对象,属性数量要一致。

比如:A对象:{Integer name; Integer code} ; B对象{String name}

这种情况,使用JSON转换会报属性找不到异常;使用BeanUtils和BeanCopier,则没有这个困扰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值