Spring Boot整合MapStruct教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取
点击前往百度网盘获取
点击前往夸克网盘获取
Spring Boot整合MapStruct教程
1. 什么是MapStruct?
MapStruct是一个基于注解的Java代码生成器,用于对象属性映射的自动化实现。相比手动编写映射代码,它可以:
- 自动生成类型安全的映射实现类
- 减少样板代码
- 编译时生成代码(无运行时性能损耗)
- 支持复杂映射场景(嵌套对象、类型转换等)
2. 环境准备
- JDK 1.8+
- Spring Boot 3.x
- Maven/Gradle
- IDE(推荐IntelliJ IDEA)
3. 整合步骤
3.1 添加依赖
在pom.xml
中添加:
<!-- MapStruct核心依赖 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
<!-- 注解处理器(必须) -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
<scope>provided</scope>
</dependency>
如果使用Lombok,需要确保mapstruct-processor在lombok之后配置
3.2 创建实体与DTO
// User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String email;
private LocalDateTime createTime;
}
// UserDTO.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
private String username;
private String email;
private String formattedDate;
}
3.3 创建Mapper接口
@Mapper(componentModel = "spring")
public interface UserMapper {
@Mapping(source = "createTime", target = "formattedDate",
dateFormat = "yyyy-MM-dd HH:mm")
UserDTO toDto(User user);
@Mapping(source = "formattedDate", target = "createTime",
dateFormat = "yyyy-MM-dd HH:mm")
User toEntity(UserDTO dto);
}
注解说明:
@Mapper(componentModel = "spring")
:生成Spring可注入的Mapper实现类@Mapping
:定义字段映射规则- 支持自动类型转换(如String <-> Date)
3.4 配置注解处理器(重要!)
在Maven的pom.xml
中添加构建配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
<!-- 如果有Lombok需要添加 -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
3.5 使用Mapper
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public UserDTO getUser() {
User user = new User(1L, "john", "john@example.com", LocalDateTime.now());
return userMapper.toDto(user);
}
}
4. 验证结果
生成的实现类在target/generated-sources/annotations/
目录下,编译后会生成类似:
@Generated
@Component
public class UserMapperImpl implements UserMapper {
@Override
public UserDTO toDto(User user) {
// 自动生成的映射逻辑
}
@Override
public User toEntity(UserDTO dto) {
// 自动生成的映射逻辑
}
}
5. 高级用法
5.1 自定义转换方法
@Mapper(componentModel = "spring")
public interface UserMapper {
default String statusToCode(Status status) {
return status.name().toLowerCase();
}
}
5.2 多对象合并
@Mapping(source = "user.name", target = "name")
@Mapping(source = "address.city", target = "city")
UserInfo merge(User user, Address address);
5.3 嵌套映射
@Mapper(uses = AddressMapper.class)
public interface UserMapper {
UserDTO toDto(User user);
}
6. 常见问题
Q: 为什么我的Mapper接口实现类没有生成?
A: 检查:
- 是否添加了
mapstruct-processor
依赖 - Maven是否执行了
mvn clean compile
- IDE是否启用了注解处理
Q: 如何与Lombok配合使用?
A: 确保在pom.xml
中Lombok配置在MapStruct之前
Q: 如何处理字段名称不一致的情况?
A: 使用@Mapping
注解显式指定映射关系
7. 总结
通过整合MapStruct可以:
- 减少80%以上的手动映射代码
- 提升代码可维护性
- 保持类型安全
- 轻松处理复杂映射场景
建议在DTO/VO转换、微服务间数据传输等场景优先使用MapStruct。
提示:实际开发中推荐结合Spring Boot Validation进行数据校验,构建更健壮的应用程序。