【问题标题】:DTO and mapper generation from Domain Objects从域对象生成 DTO 和映射器
【发布时间】:2011-02-19 04:21:03
【问题描述】:

我有很多需要转换为 DTO 的 java 域对象。

请不要从反模式的东西开始,域对象是它们的本来面目,因为历史悠久,我不能修改它们(或者不能修改太多,见下文)。

所以,当然,我们已经过了手动完成所有这些工作的时代。 我环顾四周,dozer 似乎是 DTO 映射的首选框架。

但是...我真正想要的是:在 DTO 中注释我想要的类和字段,并运行一个可以生成 DTO 和映射器的工具。

这听起来是不是太不合理了?

这样的工具已经存在了吗?

【问题讨论】:

  • 可能,但它可能有助于了解您所指的语言。 Java/.Net?
  • 是的......对不起......我问这个问题后才意识到。我已经更新了。
  • Dozer 是一个可怕的、缓慢的、黑匣子,难以调试,难以维护各种映射集合的问题,以任何复杂的关系更新对象,难以定制......啊。最好手动编写映射:快速、可调试、可通过 IDE 重构。我的 2¢
  • @NicolasC:你最终找到了一个工具吗?如果是,你用的是哪个?似乎没有一个答案真正满足了生成 DTO 的需求(“我有很多需要转换为 DTO 的 java 域对象。”),这正是我现在的需求。答案似乎都假设 DTO 已经存在。

标签: java code-generation mapping dto


【解决方案1】:

考虑查看ModelMapper

它与 Dozer 和其他产品的不同之处在于,它最大限度地减少了智能映射对象模型所需的配置量。在需要配置的地方,ModelMapper 提供了一个重构安全 API,它使用实际代码来映射属性和值,而不是使用字符串引用或 XML。

查看 ModelMapper 网站了解更多信息:

http://modelmapper.org

【讨论】:

  • ModelMapper 不是只生成映射器不生成 DTO 吗?
【解决方案2】:

您可能对MapStruct 感兴趣,这是一个JavaBeans 映射器的代码生成器。您必须实现源模型(例如您的域对象)和目标模型(例如 DTO),MapStruct 为这些模型之间的映射生成类型安全且快速的代码(免责声明:我是该项目的作者)。

【讨论】:

    【解决方案3】:

    这个帖子有点老了,但如果有人还在尝试这样做,http://www.dtonator.org/ 是我迄今为止找到的最佳选择。它是我能找到的唯一一个实际创建 DTO 文件并且不依赖于特定框架(Spring、Seam 等)或 IDE 的工具。

    【讨论】:

      【解决方案4】:

      使用 GeDA - 比所有提到的映射器都更快、更灵活。 http://inspire-software.com/confluence/display/GeDA/GeDA+-+Generic+DTO+Assembler

      wiki 上的示例不多,但 junits(源代码中)充满了它们

      【讨论】:

        【解决方案5】:

        Mybe晚了,我最近开发了一个名为beanknife的注解处理器,它支持从任何类生成DTO。您需要通过注释进行配置。但是你不需要改变原来的类。该库支持在单独的类上进行配置。当然,您可以选择您想要的和不需要的属性。您可以通过配置类中的静态方法添加新属性。这个库最强大的功能是它支持自动将对象属性转换为 DTO 版本。例如

        class Pojo1 {
            String a;
            Pojo b;
        }
        
        class Pojo2 {
            Pojo1 a;
            List<Pojo1> b;
            Map<List<Pojo1>>[] c;
        }
        
        @ViewOf(value = Pojo1.class, includePattern = ".*", excludes={Pojo1Meta.b})
        class ConfigureOfPojo2 {}
        
        @ViewOf(value = Pojo2.class, includePattern = ".*")
        class ConfigureOfPojo2 {
            // convert b to dto version
            @OverrideViewProperty(Pojo2Meta.b)
            private List<Pojo1View> b;
            // convert c to dto version
            @OverrideViewProperty(Pojo2Meta.c)
            private Map<List<Pojo1View>>[] c;
        }
        

        会生成

        // meta class, you can use it to reference the property name in a safe way.
        class Pojo1Meta {
            public final String a = "a";
            public final String b = "b";
        }
        
        // generated DTO class. The actual one will be more complicate, there are many other method.
        class Pojo1View {
            private String a;
            public Pojo1View read(Pojo1 source) { ... }
            ... getters and setters ...
        }
        
        class Pojo2Meta {
            public final String a = "a";
            public final String b = "b";
            public final String c = "c";
        }
        
        class Pojo2View {
            private String a;
            private List<Pojo1View> b;
            private Map<List<Pojo1View>>[] c;
            public Pojo1View read(Pojo2 source) { ... }
            ... getters and setters ...
        }
        

        这里有趣的是您可以安全地使用源中尚不存在的类。虽然编译器可能会抱怨,但编译后一切都会好的。因为所有额外的类都会在编译之前自动生成。 更好的做法可能是一步一步编译,先添加@ViewOf注解,然后编译,这样后面需要用到的类都生成了。配置完成后再次编译。这样做的好处是IDE不会有语法错误提示,可以更好的利用IDE的自动补全功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-18
          相关资源
          最近更新 更多