如何在ModelMapper中使用TypeMap处理空值映射避免空指针异常
问题根因分析
你遇到的两个异常的根源分别是:
- 初始代码的空指针不是ModelMapper映射逻辑抛出的,是你在
modelMapper.map执行完成后,手动调用info.getDay().getValue()时,getDay()返回null直接调用方法导致的。 - 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
相关产品推荐
相关产品推荐

