4
Dozer
Calvin edited this page 2013-11-14 01:37:15 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

##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上述的各种特性。