目录
目的
简化 BeanUtils.copyProperties 属性对拷代码,自动生成空判断,结合策略模式自定义转换
集合对拷:一行代码就能完成以前 先new,再 for循环,再add的多行代码,而且也不用判空
准备
这里我将开发中经常用到的全部依赖都列举出来(若下载不下来依赖,将settings.xml替换成我博客存档的那一份),此处为了不影响观看,放在文章末尾处。
注意
写好转换之后,maven 记得 clean install,查看一下生成的实现类有没有问题
实现类在 target 里面,若target没有,执行下列操作
相同类型-属性名不同
将 下面 Doctor 中的 i1 s1 分别转给 DoctorDto 中的 i2 s2
实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Doctor {
private int id;
private String name;
String s1;
int i1;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DoctorDto {
private int id;
private String name;
private String s2;
private int i2;
}
映射
@Mapper(componentModel = "spring")
public interface BeanConvert {
BeanConvert INSTANCE = Mappers.getMapper(BeanConvert.class);
/**
* 不一致的属性映射
*/
@Mappings({
@Mapping(target = "i2", source = "i1"),
@Mapping(target = "s2", source = "s1")
})
DoctorDto toDto(Doctor doctor);
}
使用
@GetMapping("/test")
public DoctorDto get() {
Doctor doctor = new Doctor();
doctor.setId(1);
doctor.setName("张三");
doctor.setI1(1);
doctor.setS1("1");
return BeanConvert.INSTANCE.toDto(doctor);
}
验证-查看实现类
clean install 重启
测试
可以看到 i1,s1中的值已经过来了
不同类型(策略模式)
实体类
将下面 Sku2 中的 Long date Integer code 分别转给 SkuDTO2 中的 Date date String value
一个是时间戳转换,一个是枚举转换
@Data
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Sku2 {
Long skuId;
String skuCode;
String skuPrice;
List<String> nameList;
Long date;
Integer code;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class SkuDTO2 {
Long skuId;
String skuCode;
String skuPrice;
List<String> nameList;
Date date;
String value;
}
映射
uses 定义了两个策略,一个负责转换时间戳,一个负责转换枚举
@Mapper(componentModel = "spring", uses = {TimeConvertStrategy.class, EnumConvertStrategy.class})
public interface BeanConvert {
/**
* 策略模式测试
*/
@Mapping(target = "value", source = "code")
SkuDTO2 domain2Dto(Sku2 sku2);
}
@Component
public class EnumConvertStrategy {
public String convert(Integer code) {
return MyEnum.getByCode(code);
}
}
@Component
public class TimeConvertStrategy {
public Date date2TimeStamp(Long timeStamp) {
if (timeStamp == null) {
return null;
}
return new Date(timeStamp);
}
}
public enum MyEnum {
A(1,"哈哈"),B(2,"呵呵");
private final Integer code;
private final String msg;
MyEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public static String getByCode(Integer code) {
if (code == null) {
return null;
}
for (MyEnum value : MyEnum.values()) {
if (value.getCode().equals(code)) {
return value.