使用ModelMapper将Entity转Bean时AdditionalProperty字段映射为null问题
解决ModelMapper实体转DTO时Object类型字段映射为null的问题
问题原因
你的SettingEntity中additionalProperty是Object类型,而SettingDto中对应的是AdditionalPropertyDto类型——ModelMapper默认无法自动识别这两种类型的转换关系,所以会跳过该字段的映射,导致结果为null。
解决方案
你需要给ModelMapper添加自定义类型转换器,或者通过TypeMap明确指定字段的转换规则,以下是两种可行方案:
方案一:添加自定义Converter(推荐)
利用Jackson将Object类型的JSON结构反序列化为AdditionalPropertyDto对象,步骤如下:
- 定义Converter实现:
import org.modelmapper.Converter; import org.modelmapper.spi.MappingContext; import com.fasterxml.jackson.databind.ObjectMapper; public class ObjectToAdditionalPropertyDtoConverter implements Converter<Object, AdditionalPropertyDto> { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public AdditionalPropertyDto convert(MappingContext<Object, AdditionalPropertyDto> context) { Object source = context.getSource(); if (source == null) { return null; } // 将Object(实际是JSON反序列化后的Map或其他结构)转成目标DTO return objectMapper.convertValue(source, AdditionalPropertyDto.class); } }
- 注册Converter到ModelMapper:
// 初始化ModelMapper时注册转换器 ModelMapper mapper = new ModelMapper(); mapper.addConverter(new ObjectToAdditionalPropertyDtoConverter());
之后再调用你的映射方法,additionalProperty就能正常映射了。
方案二:通过TypeMap配置字段映射规则
如果不想全局注册Converter,也可以针对SettingEntity到SettingDto的映射单独配置:
ModelMapper mapper = new ModelMapper(); // 创建TypeMap并指定字段转换逻辑 mapper.typeMap(SettingEntity.class, SettingDto.class) .addMappings(mapper -> mapper .using(new ObjectToAdditionalPropertyDtoConverter()) .map(SettingEntity::getAdditionalProperty, SettingDto::setAdditionalProperty));
这个方式只对当前TypeMap生效,适合局部特殊映射场景。
补充说明
如果你的additionalProperty存储的是JSON字符串(而非已反序列化的对象),可以修改Converter的逻辑,先将Object转成String再反序列化:
@Override public AdditionalPropertyDto convert(MappingContext<Object, AdditionalPropertyDto> context) { Object source = context.getSource(); if (source == null) { return null; } String jsonStr = source.toString(); return objectMapper.readValue(jsonStr, AdditionalPropertyDto.class); }
内容的提问来源于stack exchange,提问作者Doyel Mishra
相关产品推荐
相关产品推荐

