我已经尝试了我所知道的一切,以及在网上找到的所有内容,但都无法正常工作。我不断得到:
java.lang.ClassCastException:无法将java.util.LinkedHashMap强制转换为com.mycompany.myproject.dto.MyDto
如果有人可以告诉我我在以下代码中做错了什么,我将不胜感激:
List<Map<Long, MyDto>> dtoList = restTemplate.getForObject(myRestUrl + "/some-path/dtoInfo/" + ids, List.class);
Map<Long, MyDto> myMap = dtoList.get(0);
System.out.println("myMap SIZE is: " + myMap.size());
System.out.println("myMap is: " + myMap);
List<MyDto> dtos = new ArrayList<MyDto>(myMap.values());
StringJoiner sj = new StringJoiner(",");
for(MyDto obj : dtos) {
sjStoreIds.add(obj.getId());
}
REST调用返回一个List,该List包含一个HashMap对象,该对象的Long类型为“ Key”,而MyDto类型为“ Value”。
然后,我将打印地图的“大小”和地图本身。两者都打印正确和预期的信息。
然后,我从地图中提取值列表,如下所示:
List<MyDto> dtos = new ArrayList<MyDto>(myMap.values());
那里没有问题。
但是,当我尝试遍历转换后的列表(dtos)中的对象时,如下所示:
for(MyDto obj : dtos) {
sjStoreIds.add(obj.getId());
}
我得到java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为com.mycompany.myproject.dto.MyDto for for(MyDto obj:dtos){部分。
现在,我的大脑旋转了2个多小时。 :(
我确信这将是非常基本的事情,一旦我知道了我就会感到生气和尴尬,但是有人可以告诉我我做错了什么吗?
编辑
以下是我在服务器端执行的REST实现:
@Override
public List<Map<Long, MyDto>> getInfo(String idValues) {
List<Map<Long, MyDto>> returnList = new ArrayList<>();
Map<Long, MyDto> result = new HashMap<>();
String[] ids = idValues.split(",");
for(String id : ids) {
result.put(Long.parseLong(id), testInfo.get(Long.parseLong(id)));
}
returnList.add(result);
return returnList;
}
上面的“ testInfo”是作为SQL查询结果构建的映射。
最佳答案
restTemplate.getForObject
向您返回的东西实际上不是List<Map<Long, MyDto>>
。您显示的所有代码都是类型安全且正确的,但是getForObject
默默地跳过了其签名中的类型检查,这真是令人讨厌。找出真正的类型。 (根据您向我们展示的内容,它可能是List<Map<Long, Map<Something, Something>>>
。)