適用於數據持久層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;
}
結果