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

使用ModelMapper将Entity转Bean时AdditionalProperty字段映射为null问题

解决ModelMapper实体转DTO时Object类型字段映射为null的问题

问题原因

你的SettingEntity中additionalProperty是Object类型,而SettingDto中对应的是AdditionalPropertyDto类型——ModelMapper默认无法自动识别这两种类型的转换关系,所以会跳过该字段的映射,导致结果为null。

解决方案

你需要给ModelMapper添加自定义类型转换器,或者通过TypeMap明确指定字段的转换规则,以下是两种可行方案:


方案一:添加自定义Converter(推荐)

利用Jackson将Object类型的JSON结构反序列化为AdditionalPropertyDto对象,步骤如下:

  1. 定义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);
    }
}
  1. 注册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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:53:11