Dozer

优质
小牛编辑
138浏览
2023-12-01

Overview

对外接口,一般都使用特定的DTO对象,而不会使用领域模型,以避免两者的变动互相影响。其他框架适配等情形,也可能需要DTO对象。http://dozer.sourceforge.net/documentation/whymap.html 有更详细的场景描述。

如果手工一个个属性的在两个对象间复制有点累人,如果对象里面还有对象,就更累了。所以希望有一个工具类,可以一行代码就把对象A中的属性全部Copy到对象B中。 普通的反射框架不适合做这个事情,看看Dozer所支持的特性就知道了:

  • 支持两个对象间的属性名相同但类型不同的情况,比如CarDTO的engine属性是EngineDTO, 而Car的engine属性是Engine。
  • 支持String <-> 基础类型的转换,比如CarDTO的price属性是String, 而Car的price属性是Double.
  • 支持Collection类型间的转换,比如String[] <-> List
  • 支持双向依赖,比如Product有个属性是List parts, 而每个Part也有一个Product属性,此时Product与Part双向依赖了。
  • 如果连属性名都不一致时,可以用@Mapping(peerName)定义对方的属性名,而且只在其中一边定义就可以了。

Dozer也有个缺点,必须基于getter/setter,不能直接访问public field,卡住了我让Entity/DTO都取消掉getter/setter的计划。

Dozer已比较成熟,所以更新很慢。另一个类似但更新较勤快的项目叫Orika

In SpringSide

在core中封装了一个BeanMapper,实现如下功能:

  • 持有Dozer单例, 避免重复创建DozerMapper消耗资源.
  • 自动泛型类型转换.
  • 批量转换Collection中的所有对象.
  • 提供“创建新的B对象”与“赋值到一个已存在的B对象”两种函数.

在showcase中有一个DozerDemo,详细演示了Dozer上述的各种特性。