需求描述
在Java后端开发的时候,我们有时为了隔离变化,经常需要把数据库查询出来的实体转为返回前端的对象,我们不希望写很长的set方法去完成,于是可以考虑使用BeanUtils或BeanCopier工具类。下面通过Awards和AwardsResp类的转换简单说明下用法。
Awards类代码:
@Data
public class Awards {
private Long id;
private String topClass;
private List<AwardsDetail> detailList;
}
AwardsResp类代码:
@Data
public class AwardsResp {
private Long id;
private String topClass;
private List<AwardsDetailResp> detailList;
}
BeanUtils
BeanUtils 是org.springframework.beans下面的一个类。
简单用法如下:
AwardsResp resp = new AwardsResp();
BeanUtils.copyProperties(awards,resp);
copyProperties方法相关说明:
- 不能复制属性名相同但是类型不同的属性(比如Long和Integer)
- 不能复制list属性
- 可以把map中的属性设置到对象中
需要用org.apache.commons.beanutils包下面的类
BeanCopier
BeanCopier是org.springframework.cglib.beans包下面的一个类。
简单用法如下:
AwardsResp resp = new AwardsResp();
// 获取对象
// 第三个参数userConverter,是否开启Convert,默认BeanCopier只会做同名。对于属性名相同类型不同的需要自己写转换器
BeanCopier copier = BeanCopier.create(awards.getClass(), resp.getClass(), false);
// 开始复制
// 第三个参数也是转换器
copier.copy(awards, resp, null);
copy方法相关说明:
- 默认不能复制属性名相同但是类型不同的属性(比如Long和Integer)。当然可以自己写转换器实现。
- 可以"复制"list属性(只是把对象的引用指向改变了)
比如复制后AwardsResp的detailList指向的是Awards的detailList对象地址,Awards的detailList是什么样最终返回的就是什么样,不受List中的类型影响。
Gson或者Fastjson实现对象拷贝
BeanUtils和BeanCopier都不真正支持复制list属性,用Gson或者Fastjson就可以实现。
Gson代码如下:
Gson gson = new Gson();
AwardsResp resq = gson.fromJson(gson.toJson(awards),AwardsResp.class);