源与目标为同一类时Object类型字段映射为空如何修复
对象映射后filter字段为空的解决方案
出现该问题的核心原因是类中filter字段定义为Object类型,对象映射工具(ModelMapper/MapStruct等)默认无法识别无明确类型的复杂嵌套结构,不会对其执行递归映射赋值,导致最终目标对象的filter字段为空。可按以下优先级选择解决方案:
方案1:明确filter字段类型(最推荐)
首先定义嵌套结构对应的POJO类:
public class Filter { private List<Long> ids; private String type; // 补充全参数、无参数构造方法,以及所有字段的getter、setter方法 }
修改原有A类的filter字段类型为自定义的Filter类:
public class A { private String id; private Filter filter; // 补充全参数、无参数构造方法,以及所有字段的getter、setter方法 }
类型明确后映射工具可自动识别嵌套结构,完成递归赋值。
方案2:必须保留filter为Object类型时,调整映射工具配置
若使用ModelMapper:
开启深拷贝和未知属性映射配置:
modelMapper.getConfiguration() .setMatchingStrategy(MatchingStrategies.STRICT) .setMapUnknownProperties(true) .setDeepCopyEnabled(true);
若使用MapStruct:
在映射接口中手动指定filter字段的映射逻辑:
@Mapper public interface AMapper { AMapper INSTANCE = Mappers.getMapper(AMapper.class); @Mapping(target = "filter", expression = "java(a.getFilter())") A map(A a); }
方案3:检查基础配置项
- 确认所有用到的POJO类都提供了public的无参构造方法,以及所有字段的getter、setter方法,大部分映射工具依赖反射调用这些方法完成赋值
- 断点验证源对象
a的filter字段本身非空,排除源数据本身为空的问题
内容的提问来源于stack exchange,提问作者AbrA
相关产品推荐
相关产品推荐

