ModelMapper列表映射后遍历抛出ClassCastException问题求助
解决ModelMapper列表映射后的ClassCastException问题
嘿,我一眼就揪出问题所在了,咱们一步步来搞定它:
1. 核心错误:TypeToken的目标类型写错了
你的代码里定义的listType指向的是List<ObjectiveDto>的类型,但你明明是要把objectiveDtos(List<ObjectiveDto>)转换成List<ObjectiveModel>啊!TypeToken必须指向目标类型的列表,而不是原类型的!
错误代码:
Type listType = new TypeToken<List<ObjectiveDto>>() {}.getType(); // 这里写错成原类型Dto了 List<ObjectiveModel> objectiveModels = modelMapper.map(objectiveDtos, listType);
修正后的正确写法:
Type listType = new TypeToken<List<ObjectiveModel>>() {}.getType(); // 改成目标类型Model List<ObjectiveModel> objectiveModels = modelMapper.map(objectiveDtos, listType);
2. 更稳妥的替代方案:手动逐个转换元素
有时候ModelMapper的列表映射会返回代理对象(延迟转换),后续遍历强转时仍可能踩坑,所以更可靠的方式是逐个转换元素:
List<ObjectiveModel> objectiveModels = objectiveDtos.stream() .map(objectiveDto -> modelMapper.map(objectiveDto, ObjectiveModel.class)) .collect(Collectors.toList());
这种方式下每个ObjectiveDto都会被明确转换成ObjectiveModel实例,列表里的元素都是真实的Model对象,遍历修改时绝对不会再出现类型转换异常。
为啥原来的代码会报错?
当你用错误的TypeToken(List<ObjectiveDto>)调用map方法时,ModelMapper相当于做了个“无效映射”——把List<ObjectiveDto>原样返回,里面的元素还是ObjectiveDto对象。当你用for (ObjectiveModel objectiveModel: objectiveModels)遍历的时候,JVM尝试把Dto强制转换成Model,自然就抛出ClassCastException了。
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

