mapstruct对象转换属性
-
依赖包:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.3.1.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.3.1.Final</version> </dependency>
1.简单转换
简单的映射(字段和类型都匹配), 只有一个要求, 在接口上写@Mapper 注解即可
源对象
@Data
public class RemindOrderResultDto implements Serializable {
private boolean isSuccess;
private String receiverName;
private String receiverPhone;
private String failedReason;
private String orderId;
}
目标对象
@Data
public class RemindErrorResponse implements Serializable {
private String receiverName;
private String receiverPhone;
private String failedReason;
}
转换类
/**
* 程序内部参数转换
*/
@Mapper
public interface DtoConvert {
DtoConvert INSTANCE = Mappers.getMapper(DtoConvert.class);
RemindErrorResponse remindThreadResultCovert(RemindOrderResultDto dto);
public static void main(String[] args) {
RemindErrorResponse remindErrorResponse = DtoConvert.INSTANCE.remindThreadResultCovert(new RemindOrderResultDto());
}
}
2.自定义转换
1. 字段名不一致
在接口方法上增加@Mapping 注解
源对象
@Data
public class RemindOrderResultDto implements Serializable {
private boolean isSuccess;
private String userName;
private String phone;
private String failedReason;
private String orderId;
}
目标对象
@Data
public class RemindErrorResponse implements Serializable {
private String receiverName;
private String receiverPhone;
private String failedReason;
}
转换类
/**
* 程序内部参数转换
*/
@Mapper
public interface DtoConvert {
DtoConvert INSTANCE = Mappers.getMapper(DtoConvert.class);
@Mapping(source = "userName", target = "receiverName")
@Mapping(source = "phone", target = "receiverPhone")
RemindErrorResponse remindThreadResultCovert(RemindOrderResultDto dto);
public static void main(String[] args) {
RemindErrorResponse remindErrorResponse = DtoConvert.INSTANCE.remindThreadResultCovert(new RemindOrderResultDto());
}
}
2. 多转一
源对象
@Data
public class RemindOrderResultDto implements Serializable {
private String phone;
}
@Data
public class RemindOrderResultDto1 implements Serializable {
private String userName;
}
目标对象
@Data
public class RemindErrorResponse implements Serializable {
private String receiverName;
private String receiverPhone;
private String failedReason;
}
转换类
/**
* 程序内部参数转换
*/
@Mapper
public interface DtoConvert {
DtoConvert INSTANCE = Mappers.getMapper(DtoConvert.class);
@Mapping(source = "dto1.userName", target = "receiverName")
@Mapping(source = "dto.phone", target = "receiverPhone")
RemindErrorResponse remindThreadResultCovert(RemindOrderResultDto dto,RemindOrderResultDto1 dto1);
public static void main(String[] args) {
RemindErrorResponse remindErrorResponse = DtoConvert.INSTANCE.remindThreadResultCovert(new RemindOrderResultDto(),new RemindOrderResultDto1());
}
}
3. 自定义转换
对于某些类型, 无法直接转换,可以定义一个默认的放发
源对象
@Data
public class RemindOrderResultDto implements Serializable {
private RemindOrderResultDto1 phone;
}
@Data
public class RemindOrderResultDto1 implements Serializable {
private String userName;
}
default RemindErrorResponse1 dto1ToResponse1(RemindOrderResultDto1 dto1) {
if (dto1 == null) {
return null;
}
RemindErrorResponse1 response1 = new RemindErrorResponse1();
response1.serReceiverName(dto1.getUserName());
return response1;
}
目标对象
@Data
public class RemindErrorResponse implements Serializable {
private String receiverPhone;
private RemindErrorResponse1 receiverName;
private String failedReason;
}
@Data
public class RemindErrorResponse1 implements Serializable {
private String receiverName;
}
转换类
/**
* 程序内部参数转换
*/
@Mapper
public interface DtoConvert {
DtoConvert INSTANCE = Mappers.getMapper(DtoConvert.class);
@Mapping(source = "dto1.userName", target = "receiverName")
@Mapping(source = "dto.phone", target = "receiverPhone")
RemindErrorResponse remindThreadResultCovert(RemindOrderResultDto dto,RemindOrderResultDto1 dto1);
public static void main(String[] args) {
RemindErrorResponse remindErrorResponse = DtoConvert.INSTANCE.remindThreadResultCovert(new RemindOrderResultDto(),new RemindOrderResultDto1());
}
}
4. 更新对象
更新对象内其他字段
源对象
@Data
public class RemindOrderResultDto implements Serializable {
privat String phone;
}
@Data
public class RemindOrderResultDto1 implements Serializable {
private String userName;
}
目标对象
@Data
public class RemindErrorResponse implements Serializable {
private String receiverPhone;
private String receiverName;
private String failedReason;
}
转换类
/**
* 程序内部参数转换
*/
@Mapper
public interface DtoConvert {
DtoConvert INSTANCE = Mappers.getMapper(DtoConvert.class);
@Mapping(source = "phone", target = "receiverPhone")
RemindErrorResponse remindThreadResultCovert(RemindOrderResultDto dto);
@Mapping(source = "userName", target = "receiverName")
void fillName(@MappingTarget RemindErrorResponse response, RemindOrderResultDto1 dto1);
public static void main(String[] args) {
RemindErrorResponse remindErrorResponse = DtoConvert.INSTANCE.remindThreadResultCovert(new RemindOrderResultDto());
fillName(remindErrorResponse,new RemindOrderResultDto1());
}
}
List之间转换
- 如果涉及到实体类中属性名不一致的情况,在做集合之间转换的时候,需加实体类与实体类之间的转换。mapstruct自动做转换。
常见问题
mapstruct与lombok冲突导致报错:
does not have an accessible parameterless constructor
出现上述错误是由于mapstruct和lombok版本的不兼容导致,解决办法:
- 升级lombok版本在1.18以上
- 实体类中不使用lombok注解,改为手写构造。(不推荐,升级jar包既可解决)