您觉得本文档还缺少什么内容?可以自己补充~
本项目的对象转换工具使用开源工具dozer
, 并在dozer 原生的基础上,对一些不有好的地方进行包装。详见: bc-util-dozer-starter
什么是dozer ?
Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。
Dozer支持简单属性映射,复杂类型映射,双向映射,隐式显式映射以及递归映射。这包括映射还需要在元素级别进行映射的集合属性。 注意:dozer 目前不支持集合之间的转换 ,需要自己进行处理,稍后我会提供一个简单的工具类.
为什么选他?
- 基于API、注解、XML,可以实现优雅的对象装换
- 实现相同对象、相同字段转换
- 实现不同对象,不同字段名的转换
- 实现不同对象,不同类型的字段转换
缺点
性能差! 经过比较,Hutool的BeanUtil进行转换时,性能大大好于dozer,但却没dozer怎么灵活,所以大多数场景都会使用BeanUtil,在BeanUtil不能满足时,才会选择dozer.
使用
- 引入依赖:
bc-util-dozer-starter
<dependency>
<groupId>com.becypress.product</groupId>
<artifactId>bc-util-dozer-starter</artifactId>
</dependency>
- 注入bean
@Autowired
private DozerUtils dozer;
- 使用
RoleSaveDTO data = RoleSaveDTO.builder().build();
Role role = dozer.map(data, Role.class);
- 高级用法: (以下用法,BeanUtil貌似无法实现,所以使用dozer)
// 参考 MenuController#myRouter
List<Menu> list = menuService.findVisibleMenu(group, userId);
List<VueRouter> treeList = dozer.mapList(list, VueRouter.class);
// 其中 Menu 对象和 VueRouter对象中部分字段名不一致, 可以通过配置文件配置转换规则
// biz.dozer.xml 配置如下
<mapping date-format="yyyy-MM-dd HH:mm:ss">
<class-a>com.becypress.product.authority.entity.auth.Menu</class-a>
<class-b>com.becypress.product.authority.dto.auth.VueRouter</class-b>
<field>
<a>label</a>
<b>meta.title</b>
</field>
<field>
<a>label</a>
<b>name</b>
</field>
<field>
<a>icon</a>
<b>meta.icon</b>
</field>
</mapping>