简介
MapStruct
用于生成安全的Bean的映射类。
MapStruct
采用注解
的方式,使用它我们所需要做的就是定一个映射的接口,该接口中声明任何需要的映射方法。在代码的编译期间,由MapStruct
生成该接口的实现类。值得注意的是,MapStruct
在实现接口的时候并没有采用反射的方式,而是采用普通的java方法来实现的。
简单来说,我们在实际的项目中很多书情况下,都会遇到不同模块层之间的数据进行传递的时候,需要涉及到对象的转换:
1、比如在经典三层的项目架构中,dao
层的entity
需要传递给控制层的vo
进行数据的展示,此时就需要将entity
对象转换为vo
对象,
2、或者在DDD
领域架构设计中,repository
中的Po
对象需要传递给domain
中的领域对象时,也需要涉及到Po
对象与entity
之间的转化。
3、以及其他情况下的数据对象的转化
对于这种不同数据对象之间的转化,下面这两种方式你一定用到过其中的一个或者多个
- 手动
new
出目标对象然后将需要转化的属性手动set
到目标对象的属性中 - 使用工具类,各种
Convert
工具类。
实际上,MapStruct
的方式本质上是第一种,只不过手动set
属性的工作不需要我们来做了,我们要做的只是定义号接口,以及需要映射的方法,加好注解,在项目编译的时候,MapStruct
来帮我们实现这部分代码。
MapStruct的优点
- 与动态映射框架相比,
MapStruct
使用普通方法的调用来进行映射,而不是通过反射来实现。我们都知道反射器是降低系统的性能的,所以MapStruct
的这种速度更快。 - 编译时类型安全,只能映射互相映射的对象和属性
- 编译时错误检查
在maven项目中使用MapStruct
引入依赖
<dependencites>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</dependency>
</dependencities>
创建entity与vo
// entity
@Data
public class User {
private String id;
private String name;
private Integer age;
private String phone;
private String password;
}
//vo
@Data
public class UserVo {
private String id;
private String userName;
private Integer age;
private String mobilePhone;
}
编写映射接口Converter
@Mapper(componentModel = "spring")
public interface UserConverter {
// 将entity映射为vo
@Mapping(source = "name",target = "userName")
@Mapping(source = "phone",target = "mobilePhone")
UserVo toVo(User user);
}
注意,@Mapper
注解要引入MapStruct
包的
@Mapping
注解将名称不一样的属性通过source
与target
设置进行映射
名称一样的属性可以不编写@Mapping
注解
启动项目测试
发现数据已经正确的映射成了UserVo
的格式,对应的属性也映射正确
注意:如果像我一样使用lombok
的注解,代替了编写get和set方法的话,需要注意MapStruct
与 lombok
的版本依赖问题。如果版本不兼容就会出现下面这个问题
No property named “XXX“ exists in source parameter(s). Did you mean “null“?
这是因为在编译的时候,lombok
的还没有将对象属性的get
和set
方法生成,MapStruct
就开始实现映射接口了,由于缺少了get
和set
方法就会出现这个问题。
目前可用的版本为
MapStruct:1.3.0.final
对应lombok:1.18.10
MapStructDemo 代码下载
MapStruct还有很多值得研究的使用技巧,下篇文章见!