不知道什么时候mapstruct 突然冒了出来,以良好性能和易用性很快俘获了一大批程序的芳心。
但是初次体验mapstruct的时候却碰到了各种各样的问题,搞得很有挫折感。下面总结一下更简洁全面的入门教程,以及一些才过的坑。希望对大家有帮助。
本文以maven项目为例,
第一步添加依赖:
mapstruct 主要有两个组件mapstruct-jdk8 和mapstruct-processor
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.4.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</dependency>
第二步 在build plugin中增加 maven-compile-plugin 并配置 mapstruct-processor 到annotationProcessorPaths,另外 如果模型代码用到了lombok,也请将lombok一并配置到annotationProcessorPaths。
具体示例如下:
<build>
<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>
<encoding>UTF-8</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
第三步: 创建 mapper
Mapper的创建实际上很简单 只要声明一个接口,加上Mapper 注解 ,然后声明转换方法就ok了。
~~~DTO
public class UserDTO {
Long id;
String name;
String gender;
String email;
}
~~~entity
public class User {
Long id;
String name;
String gender;
String email;
}
~~~mapper
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface UserDTOMapper {
UserDTOMapper INSTANCE = Mappers.getMapper(UserDTOMapper.class);
User fromDTO(UserDTO dto);
UserDTO toDTO(User user);
}
~~~Service中使用mapper
public class UserService {
private UserRepository repo;
public boolean addUser(UserDTO dto) {
User user = UserDTOMapper.INSTANCE.fromDTO(dto);
repo.persist(user)
}
public UserDTO loadUser(String id) {
User user = repo.loadById(id)
UserDTO dto = UserDTOMapper.INSTANCE.toDTO(user);
return dto;
}
}
踩过的坑:
1 报告 could not retrieve mapper annotation
这个问题多半是由于项目中有swagger。 swagger里面包含了mapstruct 和新加的mapstruct-jdk8 冲突了。 只要在swagger的依赖中exclude掉 mapstruct 依赖就可以了。
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>io.springfox</groupId> <artifactId>springfox-spring-web</artifactId> </exclusion> <exclusion> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> </exclusion> </exclusions> </dependency>