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

如何在ModelMapper中使用TypeMap处理空值映射避免空指针异常

问题根因分析

你遇到的两个异常的根源分别是:

  1. 初始代码的空指针不是ModelMapper映射逻辑抛出的,是你在modelMapper.map执行完成后,手动调用info.getDay().getValue()时,getDay()返回null直接调用方法导致的。
  2. TypeMap配置报错是因为带条件的skip方法必须绑定源属性,且你同时写了map和skip两个规则作用于同一个目标字段,规则冲突。
正确实现方式

你要实现的核心逻辑是:当源对象的day属性不为null时,取day的value赋值给DTO的day字段,否则留空不赋值。有两种常用实现方案:

方案1:使用带条件的自定义映射规则

直接在TypeMap中绑定源属性和取值逻辑,加上非空条件即可:

// ModelMapper是线程安全的,全局只需要初始化一次,不要每次映射都new
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
    .setMatchingStrategy(MatchingStrategies.STRICT)
    .setDeepCopyEnabled(true);

TypeMap<Info, MyDto> typeMap = modelMapper.createTypeMap(Info.class, MyDto.class);
typeMap.addMappings(mapper -> 
    // 当源对象的getDay返回非空时,才执行赋值逻辑
    mapper.when(ctx -> ctx.getSource() != null)
          .map(Info::getDay, (dto, dayObj) -> dto.setDay(dayObj.getValue()))
);

映射方法直接简化为:

private static MyDto mapData(Info info) {
    return modelMapper.map(info, MyDto.class);
}

方案2:使用Converter处理嵌套字段取值

如果这类嵌套取value的场景很多,可以统一写个Converter复用逻辑:

// 通用Converter:处理源字段为{value:xxx}结构的取值
Converter<HasValue, String> valueConverter = context -> 
    context.getSource() == null ? null : context.getSource().getValue();

// 注册到TypeMap
typeMap.addMappings(mapper -> 
    mapper.using(valueConverter).map(Info::getDay, MyDto::setDay)
);

额外注意事项

如果空值时需要给DTO字段设置默认值(比如空字符串),直接在Converter逻辑或者条件映射的赋值逻辑里修改返回值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:39:03