一、背景
在日常项目开发中中,常常需要将pojo、po等转成dto或者vo等情况,正常我们的做法是通过new一个目标对象,通过getter、setter用于读取和写入成员变量值,但是这种方式有点笨拙。
而MapStruct方法的@Mapper恰好就提供了一个便捷转换实体类的功能,提供开发效率。
二、简单使用
1、首先,引入对应的依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
<scope>provided</scope>
</dependency>
2、定义一个通用的接口
再为两个需要相互转换的实体类间定义一个mapper接口调用,,项目启动后,将UserMapper注入Spring容器后,注解会在target文件夹中自动生成对应字段的getter、setter方法,避免了大量重复的功能。
@Mapper(componentModel = "spring", uses = {}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper extends EntityMapper<UserDTO, User> {
}
public interface EntityMapper<D, E> {
/**
* DTO转Entity
*/
E toEntity(D dto);
/**
* Entity转DTO
*/
D toDto(E entity);
/**
* DTO集合转Entity集合
*/
List<E> toEntity(List<D> dtoList);
/**
* Entity集合转DTO集合
*/
List<D> toDto(List<E> entityList);
}
在target文件夹自动生成的代码如下
3、@Mapping注解
当要相互转换的两个实体类间的代码命名不同时,可以使用改@Mapping注解针对性的进行映射。例如下图
三、总结
顺带讲一下注解中的unmappedTargetPolicy
和unmappedSourcePolicy
这两个属性的区别,前者针对的是目标对象的字段,后者针对的是源对象中的字段,这两个属性的设置将决定如何处理这些未被使用的源字段。使用的是ReportingPolicy枚举的几种方式:
IGNORE
:忽略未在映射中使用的源字段,不会生成警告或错误。WARN
:生成警告,指示有未被使用的源字段。ERROR
:产生编译错误,阻止代码编译,直到这些未被使用的源字段得到处理。