日常开发中,我们常常要写DTO,但是这玩意写起来非常麻烦,而且封装起来也费劲。
我就想稍微解决一下这个问题。
最开始我想的是转换为map进行JSON传输
相关注解
BeanField主要用于起别名或忽略属性
Warp用于声明该属性非基本属性,也可以起别名
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Char {
private Integer id;
private String name;
@Warp
private Adress adress;
}
测试类(Adress太简单不展示了)
效果
不过后来我发现这样做不好,因为数据不一定都以JSON展示,远程调用还需要封装为对象所以DTO还是不能省略的,然后我尝试了拷贝属性的方法
DTO都是
@Data
@Warp("adress")
@DTO(value = Char.class,extend = "adress")
public class User {
private Integer id;
@Value("name")
private String nickname;
@Source("adress")
private String city;
@Source("adress")
private String province;
}
第一版
注解
Value用于纠正属性名信息
Source用于指定该属性在对像类的什么属性中
效果
第二版
主要纠正第一版在DTO有多个属性处于源对象属性深层时,需要写太多注解的问题
注解
Value作用同上
Warp标注在类上,指定源对象哪些属性可以展开,会自动按属性名匹配,可以使用Value起别名
效果同上
第三版
使用代码生成,主要因为前面两种需要使用大量反射,频繁使用销毁性能
注解
Value:作用同上
DTO:标明源对象哪些属性可以展开,以及源对象类型信息
传入DTO类进行代码生成,默认生成位置与DTO类处于同一包下,也有指定生成位置的重载
生成结果,使用比较简单不再演示
全部代码:https://gitee.com/shaokang123/simple-dto/tree/master/