还在为Java对象转换抓狂?你可能需要MapStruct!
你是否经历过这样的场景?在DTO、VO、PO之间反复编写get/set方法,每次字段改动都要修改20个地方;尝试用BeanUtils.copyProperties却遭遇性能瓶颈;看着项目里充斥的Converter工具类头痛欲裂…今天介绍的MapStruct,将让你的对象转换效率提升300%!
什么是MapStruct?
这个Java代码生成器能:
- 自动生成类型安全的映射代码
- 编译时生成代码(非反射)
- 支持复杂嵌套对象转换
- 与Lombok完美兼容
- 转换性能接近手写代码
3分钟快速上手
步骤1:添加依赖
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency>
步骤2:创建映射接口
@Mapper public interface UserConverter { UserDTO toDTO(UserEntity entity); @Mapping(target="fullName", expression="java(entity.getFirstName() + ' ' + entity.getLastName())") UserVO toVO(UserEntity entity); }
步骤3:直接调用
UserVO vo = UserConverter.INSTANCE.toVO(entity);
必须掌握的5个核心技巧
1. 处理字段名不一致:
@Mapping(target="createTime", source="gmtCreate")
2. 类型转换:
@Mapping(target="age", source="birthday", dateFormat="yyyy-MM-dd")
3. 集合映射:
List<UserDTO> toDTOList(List<UserEntity> entities);
4. 组合映射:
@Mapping(target="address", source="entity.detail.address")
5. 自定义方法:
@AfterMapping default void fillExtraInfo(UserEntity source, @MappingTarget UserDTO target) { target.setStatusDesc(source.getStatus().getDesc()); }
避坑指南:新手常见问题
• 找不到实现类?检查是否配置了annotationProcessor
• 字段不生效?注意target/source的命名规范
• 需要手动编译?IDEA需开启”Enable annotation processing”
• 与Lombok冲突?确保mapstruct-processor在lombok之后
还在等什么?立即在项目中尝试替换三个手动转换类,你会回来感谢这篇教程的。下次遇到多层嵌套的复合DTO转换时,记得MapStruct支持通过@Context传递上下文参数哦!