16

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

拜托,不要从反模式的事情开始,域对象是它们的历史,因为它们的历史悠久,我不能修改它们(或者不能修改太多,见下文)。

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

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

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

这样的工具是否已经存在?

4

5 回答 5

13

考虑查看ModelMapper

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

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

http://modelmapper.org

于 2011-06-24T06:11:06.330 回答
8

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

于 2013-08-11T12:34:21.460 回答
3

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

于 2017-09-01T14:17:11.640 回答
2

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

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

于 2013-02-06T00:31:11.287 回答
1

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的自动补全功能。

于 2020-12-25T18:55:46.900 回答