You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用RestTemplate接收返回List<Menu>的RESTful接口响应

问题:如何用RestTemplate正确获取返回List的REST接口响应?

嘿,我帮你搞定这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:23