域对象生成DTO和映射器

时间:2010-05-13 16:13:24

标签: java code-generation mapping dto

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

请不要从反模式开始,因为历史悠久,域对象就是它们,我无法修改它们(或者不能修改它们,见下文)。

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

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

这听起来有点不合理吗?

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

5 个答案:

答案 0 :(得分:13)

考虑结帐ModelMapper

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

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

http://modelmapper.org

答案 1 :(得分:8)

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

答案 2 :(得分:2)

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

维基上没有很多例子,但是junits(在源代码中)充满了它们

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我晚了,我最近开发了一个名为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的自动完成功能。