如何使用RestTemplate接收返回List<Menu>的RESTful接口响应
问题:如何用RestTemplate正确获取返回List
嘿,我帮你搞定这个RestTemplate调用的问题!你现在的写法问题出在Java的泛型擦除机制上——直接用ResponseEntity<List<Menu>>.getClass()拿到的只是ResponseEntity.class,泛型的具体类型信息在运行时被抹掉了,RestTemplate根本不知道要把响应体转换成List<Menu>,大概率会抛出类型转换异常。
下面给你两种可行的解决办法,优先推荐第一种:
方法一:使用ParameterizedTypeReference(推荐)
Spring提供了ParameterizedTypeReference类来绕过泛型擦除的问题,它能在运行时保留泛型类型信息。代码示例如下:
// 如果不需要请求体或请求头,HttpEntity可以直接传null HttpEntity<Void> entity = new HttpEntity<>(null); // 用ParameterizedTypeReference明确指定要转换的泛型类型 ParameterizedTypeReference<List<Menu>> menuListType = new ParameterizedTypeReference<List<Menu>>() {}; ResponseEntity<List<Menu>> response = restTemplate.exchange( "http://127.0.0.1:8080/elcor/api/users/1/menus", HttpMethod.GET, entity, menuListType ); // 直接获取转换好的菜单列表 List<Menu> menus = response.getBody();
这种方式简洁且安全,是Spring官方推荐的处理泛型响应的方式。
方法二:手动转换响应体(不推荐,仅作参考)
如果你不想用ParameterizedTypeReference,也可以先把响应体转换成List<LinkedHashMap>,再手动转成Menu对象,但这种方式比较繁琐,容易出错:
// 先获取LinkedHashMap列表 ResponseEntity<List<LinkedHashMap<String, Object>>> response = restTemplate.exchange( "http://127.0.0.1:8080/elcor/api/users/1/menus", HttpMethod.GET, entity, new ParameterizedTypeReference<List<LinkedHashMap<String, Object>>>() {} ); // 用ObjectMapper把每个LinkedHashMap转成Menu对象 ObjectMapper objectMapper = new ObjectMapper(); List<Menu> menus = response.getBody().stream() .map(map -> objectMapper.convertValue(map, Menu.class)) .collect(Collectors.toList());
一些注意事项
- 确保你的
Menu类有无参构造器,并且字段名和接口返回的JSON字段名一致(如果不一致,可以用@JsonProperty注解做映射),这样RestTemplate的消息转换器才能正确反序列化。 - 如果你的请求不需要任何请求头或请求体,
exchange方法的第三个参数直接传null即可,不用特意创建HttpEntity。
内容的提问来源于stack exchange,提问作者en Peris
相关产品推荐
相关产品推荐

