适用于数据持久层pojo对象转换数据传输层DTO
utils.TypeConverter
import cn.temp.tempbeans.api.dto.ValidDTO;
import cn.temp.tempbeans.pojo.User;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/***
* author:zjhChester
* date:2020-07-01
* environment: jdk1.8
* 适用场景:适用于数据持久层pojo对象转换数据传输层DTO
*/
public class TypeConverter {
public <T, S> T convert(S s, Class<T> clz) throws IllegalAccessException,
InstantiationException {
//获取输出对象的属性列表
Field[] f1 = clz.getDeclaredFields();
Map<String,Object> map = new HashMap<>();
for (Field f : f1) {
//将输出对象的属性名装入map
map.put(f.getName(),null);
}
//获取输入对象的属性列表
Field[] f2 = s.getClass().getDeclaredFields();
for (Field f : f2) {
//便利执行 匹配输入对象的属性名
if(map.containsKey(f.getName())){
//设置私有属性可见性
f.setAccessible(true);
try {
//属性一致则将输入对象的属性值存放到的map的以对应属性名为key的
值中 覆盖原来的null
map.put(f.getName(),f.get(s));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
//反射获取输出对象实例
T t = clz.newInstance();
for (Map.Entry<String,Object> e:map.entrySet() ) {
//过滤map中的空值对象,即无匹配属性
if(e.getValue()!=null){
for (Field f : f1) {
f.setAccessible(true);
//将符合 map的key==输出对象的属性名 并且map的
value.getClass() == 输出对象的属性类型
if(f.getName().equals(e.getKey())&&map.get(f.getName())!
=null && f.getType().equals(map.get(f.getName()).getClass())){
//存放到输出对象的属性中
f.set(t,e.getValue());
}
}
}
}
//返回输出对象
return t;
}
public static void main(String[] args) throws InstantiationException,
IllegalAccessException {
User user = new User();
user.setId(1);
user.setUsername("zjh");
ValidDTO convert = new TypeConverter().convert(user, ValidDTO.class);
System.out.println(user);
System.out.println(convert);
}
}
dto.ValidDTO
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
//swaggerModel描述
@ApiModel("valid数据格式检测注解测试")
public class ValidDTO {
@NotNull(message = "id不能为空")
private Integer id;
/*** swaggerModel成员变量描述
* @ApiModelProperty注解如果注释类型是integer 等基本类型包装类 需要赋初值
*/
@ApiModelProperty("ValidDTOName")
@NotBlank(message = "name不能为空")
private String username;
@ApiModelProperty("ValidDTOEmail")
@Email(message = "邮箱格式不对")
@NotBlank(message = "邮箱不能为空")
private String email;
@Max(value = 10,message = "money长度超长")
private Integer money;
/**
* 不写message的默认提示:cn.temp.tempbeans.conf.Exception - 最大不能超过2
*/
@Max(value = 2)
private Integer age;
}
pojo.User
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("用户对象")
public class User {
// @ApiModelProperty(value = "用户id")
// @NotNull(message = "id不能为空")
private Integer id;
// @ApiModelProperty(value = "用户username")
// @NotBlank(message = "username不能为空")
private String username;
// @ApiModelProperty(value = "用户password")
// @NotBlank(message = "password不能为空")
private String password;
}
结果