如何用ModelMapper为同一源与目标创建两种不同映射方法
实现ModelMapper单例的自定义跳过字段映射
针对你的需求,要在同一个ModelMapper单例中同时支持全量映射和跳过address字段的映射,核心思路是为同一组源/目标类创建两个独立的TypeMap:一个保留默认全量映射逻辑,另一个配置跳过address字段,再封装成自定义方法调用即可,完全不会影响原有映射逻辑。
具体实现步骤
初始化ModelMapper单例并配置双TypeMap
在创建单例时,同时配置默认全量映射和跳过address的命名TypeMap:// 创建全局单例实例 ModelMapper modelMapper = new ModelMapper(); // 默认全量映射,保持原有业务逻辑 modelMapper.createTypeMap(User.class, UserDto.class); // 创建命名为"withoutAddress"的TypeMap,配置跳过address字段 TypeMap<User, UserDto> withoutAddressTypeMap = modelMapper.createTypeMap(User.class, UserDto.class, "withoutAddress"); withoutAddressTypeMap.addMappings(mapper -> mapper.skip(UserDto::setAddress));封装自定义映射方法
如果你希望直接通过modelMapper.mapWithoutAddress(...)的方式调用,可以扩展ModelMapper类,添加专属自定义方法:public class CustomModelMapper extends ModelMapper { // 针对User到UserDto的专属跳过映射方法 public UserDto mapWithoutAddress(User user) { return super.map(user, UserDto.class, "withoutAddress"); } // 通用版本,支持其他类的跳过字段映射(需提前为对应类配置好同名TypeMap) public <S, D> D mapWithoutAddress(S source, Class<D> destinationType) { return super.map(source, destinationType, "withoutAddress"); } }实际使用示例
初始化单例后,两种映射方法互不干扰,按需调用即可:// 原有全量映射逻辑 UserDto fullUserDto = customModelMapper.map(user, UserDto.class); // 跳过address字段的映射逻辑 UserDto userDtoWithoutAddress = customModelMapper.mapWithoutAddress(user);
注意事项
- 所有TypeMap配置都是全局生效的,初始化一次后可重复调用,无需每次重新配置。
- 如果需要对其他类实现类似的跳过字段映射,只需为对应源/目标类创建同名的TypeMap,即可复用通用方法。
内容的提问来源于stack exchange,提问作者Hassen Gaaya
相关产品推荐
相关产品推荐

