MapStruct使用指南
MapStruct引入
pom引用
支持与lombok一同使用,lombok和MapStruct都是利用注解生成代码
<properties>
<lombok.version>1.18.24</lombok.version>
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
</properties>
...
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
...
<!--
配置编译插件,自动生成对象转换代码,类似与lombok
MapStruct会依赖lombok的@Getter、@Setter等方法、
使用annotationProcessorPaths规定mapstruct与lombok注解处理顺序
防止MapStruct使用getter、setter方法时,lombok还没有生成,导致报错
-->
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
IDEA插件
推荐安装IDEA插件MapStruct support
,可直接在插件市场搜索
- 支持字段联想功能
- 支持字段的跳转
插件链接:https://plugins.jetbrains.com/plugin/10036-mapstruct-support
MapStruct使用方法
基本使用
映射需求
使用MapStruct实现两个对象的转换,首先编写一个接口类Interface,接口上需要使用MapStruct的注解@Mapper
,表明这是一个转换接口,需要MapStruct在编译时自动生成转换代码。然后编写方法,并在方法上使用MapStruct的注解@Mapping
写明转换规则,然后编译即可。
如现在有JobRequest
和Job
两个类,需要实现JobRequest->Job
的映射
public class JobRequest {
private String name;
private String type;
private List<String> arguments;
}
public class Job {
private String id;
private String name;
private String type;
private List<String> arguments;
}
MapStruct转换接口
// 标识是MapStruct的转换接口
@Mapper
public interface JobAssembler {
// 转换类的单例,需要使用的地方调用JobAssembler.INSTANCE.toJob()即可
JobAssembler INSTANCE = Mappers.getMapper(JobAssembler.class);
@Mapping(target = "id", ignore = true)
@Mapping(target = "name", source = "name")
@Mapping(target = "type", source = "type")
@Mapping(target = "arguments", source = "arguments")
Job toJob(JobRequest request);
}
使用MapStruct转换接口
pubic void processJobRequest(JobRequest jobRequest) {
Job job = JobAssembler.INSTANCE.toJob(jobRequest);
// job处理, do something
}
MapStruct生成代码
在编译阶段,MapStruct会自动生成转换接口JobAssembler
的实现类JobAssemblerImpl
的代码。
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-06-05T20:04:07+0800",
comments = "version: 1.4.2.Final, compiler: javac, environment: Java 1.8"
)
public class JobAssemblerImpl implements JobAssembler {
@Override
public Job toJob(JobRequest jobRequest) {
if ( jobRequest == null ) {
return null;
}
Job job = new Job();
job.setName( jobRequest.getName() );
job.setType( jobRequest.getType() );
job.setArguments( jobRequest.getArguments() );
return job;
}
基本映射规则
- 当属性名相同时,默认会进行映射,不必显式使用
@Mapping
注解 - 当属性名不同时,需要显式使用
@Mapping
注解