如何使用Orika实现Map<Integer, List<Integer>>到Map<Integer, List<String>>的映射
问题原因
你遇到的是Orika这类字节码生成式映射框架的已知设计缺陷,核心问题出在顶级泛型嵌套集合的类型解析逻辑,而非映射规则不一致:
- 嵌套在POJO中时映射正常的原因:当Map作为POJO的字段存在时,Orika可以通过反射字段的完整签名,拿到多层泛型信息:既知道外层Map的value是List类型,也能解析到内层List需要完成
Integer到String的类型转换,因此会自动递归处理元素。 - 顶级Map映射失败的原因:处理顶级集合映射时,Orika的类型解析逻辑只会读取
Map的key和value的原始类型,不会深入解析value的泛型参数。也就是说你通过TypeBuilder构造的嵌套泛型信息没有被完全读取,框架只知道要转成Map<Integer, List>,不知道List内部需要做元素转换,因此要么返回空Map,要么只生成空的List结构。
可行解决方案
- 方案一:直接使用你已经验证过的包装类方案,将Map嵌套在无业务逻辑的空POJO中完成映射,不需要额外配置,适配性最好。
- 方案二:手动注册对应类型的转换器,明确告诉框架
List<Integer>到List<String>的转换规则,示例配置如下:
mapperFactory.getConverterFactory().registerConverter(new CustomConverter<List<Integer>, List<String>>() { @Override public List<String> convert(List<Integer> source, Type<? extends List<String>> destinationType) { return source.stream().map(String::valueOf).collect(Collectors.toList()); } });
注册完成后再执行顶级Map映射即可得到正确结果。
内容的提问来源于stack exchange,提问作者alaster
相关产品推荐
相关产品推荐

