Mybe晚了,我最近开发了一个名为beanknife的注释处理器,它支持从任何类生成DTO。您需要通过注释进行配置。但是你不需要改变原来的类。该库支持在单独的类上进行配置。当然,您可以选择您想要的和不需要的属性。您可以通过配置类中的静态方法添加新属性。这个库最强大的功能是它支持自动将对象属性转换为 DTO 版本。例如
class Pojo1 {
String a;
Pojo b; // circular reference to Pojo2
}
class Pojo2 {
Pojo1 a;
List<Pojo1> b;
Map<List<Pojo1>>[] c;
}
// remove the circular reference in the DTO
@ViewOf(value = Pojo1.class, includePattern = ".*", excludes={Pojo1Meta.b})
class ConfigureOfPojo2 {}
// use the no circular reference versioned dto replace the Pojo1
@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。您可以像示例一样定义没有循环引用的 Dto。此外,您可以为 Pojo2 定义另一个 dto,并删除所有对 Pojo1 的属性引用,并使用它来替换 Pojo1 中的属性 b。