当前位置: 首页 > news >正文

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: 检查:

  1. 是否添加了mapstruct-processor依赖
  2. Maven是否执行了mvn clean compile
  3. IDE是否启用了注解处理

Q: 如何与Lombok配合使用?
A: 确保在pom.xml中Lombok配置在MapStruct之前

Q: 如何处理字段名称不一致的情况?
A: 使用@Mapping注解显式指定映射关系

7. 总结

通过整合MapStruct可以:

  • 减少80%以上的手动映射代码
  • 提升代码可维护性
  • 保持类型安全
  • 轻松处理复杂映射场景

建议在DTO/VO转换、微服务间数据传输等场景优先使用MapStruct。


提示:实际开发中推荐结合Spring Boot Validation进行数据校验,构建更健壮的应用程序。

相关文章:

  • Tomato 文件包含漏洞靶机 通关攻略
  • LeetCode Hot100刷题——对称二叉树
  • 高级java每日一道面试题-2025年2月22日-数据库篇[Redis篇]-Redis是什么?
  • Hi3516DV300 移植Qt
  • 数组 与 高精度
  • 蓝桥杯备考:数据结构vector-----询问学号
  • SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。
  • MySQL库和表的操作详解:从创建库到表的管理全面指南
  • MS-DOS 6.22 下建立 FTP 服务器
  • Oracle数据库存储结构--物理存储结构
  • 【性能优化】MySQL 生产环境 SQL 性能优化实战案例
  • Node.js学习分享(下)
  • 3-002: MySQL 中使用索引一定有效吗?如何排查索引效果?
  • 【蓝桥杯】3514字串简写
  • 【LangChain接入阿里云百炼deepseek】
  • Jenkins 安装插件后构建成功但未启动容器的解决方法
  • 常见JVM命令
  • 基于AI智能算法的无人机城市综合治理
  • 有关MyBatis的缓存(一级缓存和二级缓存)
  • 网络华为HCIA+HCIP网络基础
  • 建立双城双向科创项目孵化机制,2025沪港创新项目评选启动
  • 外交部:国际调解院着眼以调解定分止争,更好维护国际公平正义
  • 在越剧之乡嵊州,浙江音乐学院越剧学院成立
  • 牛市早报|上市公司重大资产重组新规出炉,4月经济数据将公布
  • 复旦大学艺术馆开馆:以当代视角再看文科文脉
  • 竞彩湃|英超欧冠悬念持续,纽卡斯尔诺丁汉能否拿分?