返回介绍

Dozer

发布于 2021-08-08 13:40:57 字数 4591 浏览 904 评论 0 收藏 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文