ModelMapper 使用

ModelMapper 使用
在 Spring Boot 工程里使用 ModelMapper核心思路是把它注册成一个 Spring Bean然后像普通 Service 一样注入使用。整个集成过程并不复杂但有一些关键的配置细节会直接影响生产环境的安全性需要特别注意。下面为你分解整个集成过程。 第一步添加 Maven 依赖在项目的pom.xml中引入 ModelMapper 核心包。根据你的 Spring Boot 版本选择一个兼容的稳定版本如 3.1.1。xmldependency groupIdorg.modelmapper/groupId artifactIdmodelmapper/artifactId version3.1.1/version /dependency⚙️ 第二步配置成 Spring Bean创建一个配置类把ModelMapper实例化为 Spring Bean。这里有几个强烈建议开启的配置能避免很多“莫名其妙”的线上问题setSkipNullEnabled(true)生产环境必开。它能确保在更新操作时不会因为 DTO 里没传的字段把数据库中已有的值覆盖成null。setMatchingStrategy(MatchingStrategies.STRICT)使用严格匹配策略。避免字段名相似但含义不同时发生错误的“张冠李戴”。setFullTypeMatchingRequired(true)要求类型完全匹配进一步提升映射的准确性。完整的配置类代码如下javaimport org.modelmapper.ModelMapper; import org.modelmapper.convention.MatchingStrategies; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class ModelMapperConfig { Bean public ModelMapper modelMapper() { ModelMapper modelMapper new ModelMapper(); // 核心配置跳过 null 值避免意外覆盖 modelMapper.getConfiguration().setSkipNullEnabled(true); // 使用严格匹配策略 modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); // 要求类型完全匹配 modelMapper.getConfiguration().setFullTypeMatchingRequired(true); return modelMapper; } }✍️ 第三步在业务代码中注入使用在需要做对象转换的 Service 或 Controller 里像注入普通 Bean 一样注入ModelMapper然后调用它的map()方法即可完成转换。这是一个典型的 Service 层使用示例javaimport org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; Service public class UserService { private final ModelMapper modelMapper; public UserService(ModelMapper modelMapper) { this.modelMapper modelMapper; } public UserDTO getUserDTO(User user) { // 核心方法将 User 对象映射为 UserDTO 对象 return modelMapper.map(user, UserDTO.class); } } 进阶处理字段名不一致和自定义转换遇到字段名不同或需要类型转换时ModelMapper 也提供了解决方案。下面的例子演示了如何针对特定类配置映射规则字段映射将UserModel的name映射到User的realName。字段跳过更新时跳过password字段防止被意外清空。自定义转换器将Date类型转换为字符串格式。javaimport org.modelmapper.AbstractConverter; import org.modelmapper.Converter; import org.modelmapper.ModelMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.text.SimpleDateFormat; import java.util.Date; Configuration public class ModelMapperConfig { Bean public ModelMapper modelMapper() { ModelMapper modelMapper new ModelMapper(); // ... 基础配置 ... // 1. 定义 Date 转 String 的转换器 ConverterDate, String dateToString new AbstractConverterDate, String() { Override protected String convert(Date date) { return date null ? null : new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(date); } }; // 2. 为 UserModel 和 User 之间的转换配置规则 modelMapper.typeMap(UserModel.class, User.class) .addMappings(mapper - { mapper.map(UserModel::getName, User::setRealName); // name - realName mapper.skip(User::setPassword); // 跳过 password mapper.using(dateToString).map(User::getCreateTime, UserModel::setCreateTime); // 用转换器 }); return modelMapper; } }⚖️ 性能与选型提醒ModelMapper 基于运行时反射实现在性能上会稍逊于 MapStruct 这类编译期生成代码的工具。如果你的项目对接口性能或吞吐量有极致要求比如高并发核心交易系统建议评估 MapStruct 这类高性能方案。如果项目以业务逻辑为主转换频次不高ModelMapper 的便捷性足以覆盖它的性能开销。 参考资料How to Use ModelMapper in Spring Boot with an Example Project (Entity ↔ DTO Mapping)ModelMapper与Spring集成企业级应用的最佳实践ModelMapper配置与使用详解Java Guides - Spring Boot ModelMapper Example