MapStruct 自动映射注解 @AutoMapper 详解

📅 2026/7/31 15:32:19
MapStruct 自动映射注解 @AutoMapper 详解
前言在 Java 开发中对象之间的转换是一个高频操作。比如前端传参用BO (Business Object)数据库存储用Entity接口返回用VO (View Object)如果手写get/set转换代码不仅繁琐还容易出错。本文介绍MapStruct的AutoMapper注解让你告别手动转换。一、什么是 AutoMapperAutoMapper是 MapStruct 的自动映射注解在编译期自动生成对象转换代码运行时直接调用性能接近手写代码。基本用法AutoMapper(target Supplier.class) public class SupplierBo { private Long supplierId; private String supplierName; // ... }编译后会自动生成Component public class SupplierBoToSupplierMapperImpl implements SupplierBoToSupplierMapper { Override public Supplier convert(SupplierBo source) { if (source null) return null; Supplier target new Supplier(); target.setSupplierId(source.getSupplierId()); target.setSupplierName(source.getSupplierName()); return target; } }二、核心属性详解1. target - 目标类AutoMapper(target Supplier.class)指定要转换成的目标类。上例表示SupplierBo可以转换成Supplier。2. reverseConvertGenerate - 是否生成反向转换器AutoMapper(target Supplier.class, reverseConvertGenerate false)值含义true(默认)生成双向转换Bo↔Entityfalse只生成单向转换Bo→Entity三、实战场景为什么 Bo 要设置 reverseConvertGenerate false项目中的三种对象对象类型职责转换方向Bo接收前端参数、参数校验前端 → 后端Entity数据库实体类与数据库交互Vo返回给前端的数据后端 → 前端实际代码对比Bo 类只接收参数不需要反向转换Data AutoMapper(target Supplier.class, reverseConvertGenerate false) public class SupplierBo extends BaseEntity { NotNull(message 供应商ID不能为空, groups {EditGroup.class}) private Long supplierId; NotBlank(message 供应商名称不能为空, groups {AddGroup.class, EditGroup.class}) private String supplierName; // ... }Vo 类需要双向转换用于查询返回Data ExcelIgnoreUnannotated AutoMapper(target Supplier.class) // 默认 reverseConvertGenerate true public class SupplierVo implements Serializable { ExcelProperty(value 供应商ID) private Long supplierId; ExcelProperty(value 供应商名称) private String supplierName; // ... }四、在 Service 中使用方式一注入 Mapper 接口Service public class SupplierServiceImpl implements ISupplierService { Autowired private SupplierBoToSupplierMapper boMapper; Override public void add(SupplierBo bo) { // Bo 转 Entity Supplier entity boMapper.convert(bo); supplierMapper.insert(entity); } }方式二使用工具类更简洁Service public class SupplierServiceImpl implements ISupplierService { Override public void add(SupplierBo bo) { Supplier entity MapstructUtils.convert(bo, Supplier.class); supplierMapper.insert(entity); } Override public SupplierVo getById(Long id) { Supplier entity supplierMapper.selectById(id); // Entity 转 Vo return MapstructUtils.convert(entity, SupplierVo.class); } }五、配合校验注解使用Bo 类通常配合JSR-303 校验注解使用NotNull(message 供应商ID不能为空, groups {EditGroup.class}) private Long supplierId; NotBlank(message 供应商名称不能为空, groups {AddGroup.class, EditGroup.class}) private String supplierName;注解作用适用场景NotNull值不能为 null修改时必须传 IDNotBlank字符串不能为 null 且长度 0新增/修改时名称必填groups分组校验新增和修改的校验规则不同六、总结问题答案为什么要用 AutoMapper自动生成转换代码减少手写 get/settarget 属性是什么指定转换的目标类reverseConvertGenerate false 什么意思只生成单向转换Bo 用于接收参数转实体Bo 和 Vo 的设置有什么区别Bo 单向Vo 双向因为要返回给前端参考MapStruct 官方文档Spring Boot 整合 MapStruct