前言
MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java bean类型之间的映射的实现。
生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解
一、MapStruct是什么?
MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java bean类型之间的映射的实现。
生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解
二、使用步骤
1.POX.XML加入以下配置
代码如下(示例):
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- depending on your project -->
<target>1.8</target> <!-- depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
定义一个映射接口:
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(source = "name",target = "userName")
PersonDto personDoToPersonDto(PersonDo personDo);
}
定义DO
@Data
public class PersonDo {
private String name;
private int age;
}
定义DTO
@Data
public class PersonDto {
private String userName;
private int age;
}
测试方法:
public static void main(String[] args) {
PersonDo personDo = new PersonDo();
personDo.setName("王五");
personDo.setAge(20);
PersonDto personDto = PersonMapper.INSTANCE.personDoToPersonDto(personDo);
System.out.println(personDto.getUserName());
}
总结
核心代码在
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
原理是在其编译时 生成Impl文件,如下源码:
T mapper = classLoader.loadClass(clazz.getName() + "Impl").newInstance();
注意:
mapstruct整合lombok时会出现一些问题比如:
调用测试方法时候:throw new ClassNotFoundException("Cannot find implementation for " + mapperType.getName());
解决方法:查看目录下是否生成实现类,没有代表冲突编译时错误,最好是先去掉lombok依赖。maven-compiler-plugin 换成3.6.0
项目编译时出现 @Mapping(source = "name",target = "userName")中无name属性,把 mapstruct 版本改成 1.3.0.Final
以上错误可能出现