学习笔记 - MapStruct 映射工具
- 简介
- Maven 依赖
- 实体类 Entity
- 数据传输对象 DTO
- 映射接口
- 测试类
- IDEA 插件
- 与 Lombok 一起使用
- 参考资料
简介
-
MapStruct是一个代码生成器,它基于约定优于配置的方法,极大地简化了Java bean类型之间映射的实现。
生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。 -
多层应用程序通常需要在不同对象模型(例如实体和dto)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct的目标是通过尽可能地自动化来简化这项工作。
与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。 -
MapStruct是一个插入到Java编译器中的注解处理器,可以在命令行构建(Maven, Gradle等)中使用,也可以在您首选的IDE中使用。
MapStruct使用合理的默认值,但当涉及到配置或实现特殊行为时,它也不会妨碍你。
Maven 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jerry</groupId>
<artifactId>mapstruct-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
<org.projectlombok.version>1.18.20</org.projectlombok.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.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>${org.projectlombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.13.1</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
实体类 Entity
package com.jerry;
import lombok.Data;
@Data
public class Hero{
private String name;
private Integer age;
private Integer gender;
}
数据传输对象 DTO
package com.jerry;
import lombok.Data;
@Data
public class HeroDTO {
private String name;
private Integer sex;
}
映射接口
package com.jerry;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface HeroMapper {
HeroMapper INSTANCE = Mappers.getMapper( HeroMapper.class );
@Mapping(source = "gender", target = "sex")
HeroDTO hero2HeroDTO(Hero hero);
}
测试类
package com.jerry;
import org.junit.Test;
public class HeroMapperTest {
@Test
public void hero2HeroDTO() {
Hero hero = new Hero();
hero.setName("笑虾");
hero.setAge(18);
hero.setGender(1);
HeroDTO heroDto = HeroMapper.INSTANCE.hero2HeroDTO( hero );
System.out.println(heroDto);
}
}
IDEA 插件
MapStruct Support
安装插件后,将标放这里,按智能补全
热键 Alt + /
可以列出所有字段
供选择。
我这里用的是 Alt + /
我自定义过。因为默认的 Ctrl + 空格
跟我们切输入法冲突了。
与 Lombok 一起使用
版本匹配问题,如果版本对不上会报
Error:(11, 5) java: No property named "属性名" exists in source parameter(s). Type "类名" has no properties.
官方说MapStruct
可以和Lombok
配合使用,比如 MapStruct 1.2.0.Beta1
和 Lombok 1.16.14
。
如果您使用的是 Lombok 1.18.16
或更新
版本,还需要添加 lombok-mapstruct-binding ,才能让Lombok
和MapStruct
协同工作。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</dependency>
官方还有Demo:mapstruct-lombok
另外如果项目中已经使用旧版本的MapStruct
或Lombok
,解决方案是将Lombok
要修改的javabean
和MapStruct
要处理的映射器接口放在项目的两个独立模块
中。然后Lombok
将在第一个模块
的编译中运行,从而在MapStruct
在第二个模块
的编译期间运行时完成bean类。
参考资料
官网:https://mapstruct.org