You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ModelMapper为同一源与目标创建两种不同映射方法

实现ModelMapper单例的自定义跳过字段映射

针对你的需求,要在同一个ModelMapper单例中同时支持全量映射和跳过address字段的映射,核心思路是为同一组源/目标类创建两个独立的TypeMap:一个保留默认全量映射逻辑,另一个配置跳过address字段,再封装成自定义方法调用即可,完全不会影响原有映射逻辑。

具体实现步骤

  1. 初始化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));
    
  2. 封装自定义映射方法
    如果你希望直接通过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");
        }
    }
    
  3. 实际使用示例
    初始化单例后,两种映射方法互不干扰,按需调用即可:

    // 原有全量映射逻辑
    UserDto fullUserDto = customModelMapper.map(user, UserDto.class);
    
    // 跳过address字段的映射逻辑
    UserDto userDtoWithoutAddress = customModelMapper.mapWithoutAddress(user);
    

注意事项

  • 所有TypeMap配置都是全局生效的,初始化一次后可重复调用,无需每次重新配置。
  • 如果需要对其他类实现类似的跳过字段映射,只需为对应源/目标类创建同名的TypeMap,即可复用通用方法。

内容的提问来源于stack exchange,提问作者Hassen Gaaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 21:45:16