开发中,我们需要将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.youkuaiyun.com/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,则没有这个困扰