【问题标题】:Mapper code generation映射器代码生成
【发布时间】:2016-12-02 16:27:44
【问题描述】:

有许多可用于 pojo 和 DTO 的映射器工具。查看链接:any tool for java object to object mapping? 但是有什么工具可以自动生成DAO、Service类吗?

推土机样品:

<mapping>
  <class-a>yourpackage.SourceClassName</class-a>
  <class-b>yourpackage.DestinationClassName</class-b>
    <field>
      <A>yourSourceFieldName</A>
      <B>yourDestinationFieldName</B>
    </field>
</mapping>

SourceClassName sourceObject = ...
Mapper mapper = new DozerBeanMapper();
DestinationObject destObject =
    mapper.map(sourceObject, DestinationClassName.class);
assertTrue(destObject.getYourDestinationFieldName().equals(sourceObject.getYourSourceFieldName));

这里的 xml 配置很好,但是我可以跳过代码部分,只指定 POJO-DTO 配置或 POJO-DTO 以及过滤器配置。并且一些工具应该能够以DAO和Service类的形式自动生成中间翻译代码。有没有这样的工具可用?

【问题讨论】:

    标签: java mapping datamapper


    【解决方案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的自动补全功能。

    要在代码中使用 DTO 对象,只需像这样调用静态读取方法

    Pojo2 source = ...
    Pojo2View dto = Pojo2View.read(source);
    List<Pojo2> listSource = ...
    List<Pojo2View> dtoList = Pojo2View.read(listSource)
    Map<String, Pojo2> mapSource = ...
    List<Pojo2View> dtoMap = Pojo2View.read(mapSource)
    

    没有反射,没有魔法。您可以在生成的类中检查所有逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多