我正在用Java开发一个微服务项目,使用Sping Boot 和Eureka 。我遇到了这样一个场景,我使用-
List<Rating> ratings=(List<Rating>) restTemplate.getForObject("http://localhost:8083/microservices/rating/get-all-ratings-by-user?userId=ddb8e2a9-ac6f-460d-a43e-eae23d18450c", Map.class).get("data");
我在这条线上收到警告-
**说明-**我从上面使用的URL得到以下响应-
{
"data": [
{
"ratingId": "6140b240-9a97-430d-92b9-0fcfa8edc96f",
"userId": "ddb8e2a9-ac6f-460d-a43e-eae23d18450c",
"hotelId": "1093aa3f-8529-4330-8ce8-caa82546200b",
"rating": 4,
"feedback": "Died peacefully"
}
],
"message": "Success",
"code": "2000"
}
目标-我希望从响应的data字段中提取Rating对象的列表,并将其存储为List。此外,我希望对其进行迭代并执行其他操作。
1.我将它转换为一个Map(在getForObject()方法中传递的Map.class)。
1.我使用**.get(“data”)获得类型Map的列表。**
1.这是转换为**List**的类型。
我的问题-
使用上述方法,我能够获得Rating类的对象列表。但是,有人能解释**如何使用此Map吗(使用.get(“data”)获得)使用简单的类型转换自动转换为List?**代码似乎没有使用任何像Jackson这样的对象Map器。此外,我收到了一个警告。有什么方法可以删除它吗?我可以将列表原样发送到GET请求。
但如果我尝试使用列表上的方法,我会得到错误-
跟进-
1.我尝试在上面获得的List中使用stream()和map(),但是得到了一个错误-
ratings=ratings.stream().map(rating->{
//api call to hotel service to obtain the hotel
Hotel hotel=(Hotel) restTemplate.getForEntity("http://localhost:8086/microservices/hotel/get-hotel-by-id?hotelId="+rating.getHotelId(), Map.class).getBody().get("data");
logger.info("fetched hotel: ", hotel);
rating.setHotel(hotel);
}).collect(Collectors.toList());
**.map()**上出现编译时错误-
1.forEach()给出类转换异常-
ratings.forEach((rating)->{
//api call to hotel service to obtain the hotel
Hotel hotel=(Hotel) restTemplate.getForEntity("http://localhost:8086/microservices/hotel/get-hotel-by-id?hotelId="+rating.getHotelId(), Map.class).getBody().get("data");
logger.info("fetched hotel: ", hotel);
rating.setHotel(hotel);
});
forEach()上出错-
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.example.user_service.entities.Rating (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.example.user_service.entities.Rating is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @db2af5f)
at java.base/java.util.ArrayList.forEach(Unknown Source) ~[na:na]
at com.example.user_service.ServiceImpl.UserServiceImpl.getUser(UserServiceImpl.java:84) ~[classes/:na]
at com.example.user_service.controller.UserController.getUserById(UserController.java:53) ~[classes/:na]
1条答案
按热度按时间watbbzwu1#
你的任务太复杂了,你可以把json响应从
RestTemplate
转换成String
值,然后用Jackson库提取其中的 data 部分,如下所示:这是使用
JsonNode#at
方法实现的,该方法在json中定位带有 data 标签的特定节点,要将其转换为List<Rating>
,必须使用TypeReference
示例化对泛型类型List<Rating>
的引用。