spring-boot - 为什么 RestTemplate 返回 ArrayList而不是模型类型的真实列表?
问题描述
这是一个Springboot项目。代码片段如下。在第 59 行,所需的返回类型restTemplate.getForEntity
为List<Template>
。调试的时候发现实际返回类型是一个ArrayList,里面包含很多LinkedHashMap。
虽然 LinkedHashMap 不是模板的子类。我不知道为什么期望结果类型和实际结果类型匹配。
谁能告诉它为什么不返回ArrayList<Template>
,而不是ArrayList<LinkedHashMap>
?谢谢。
模板是我们项目中定义的模型。
public class Template {
private String id;
private String name;
private String content;
xxx getters and setters
}
它是一个调用 resttemplate 的控制器。
@PostMapping(value = "/getTemplatesByGroup", produces = "application/json;charset=UTF-8")
@ResponseBody
public EUDataGrid<Template> getTemplatesByGroup(@RequestParam(defaultValue = "-1") Integer groupId) {
EUDataGrid<Template> grid = new EUDataGrid<>();
xxxx
List<Template> list = restTemplate.getForEntity(urlFullTemplates, ArrayList.class).getBody();
xxxx
return grid;
}
Json结果格式如下
[
{
"id": 1788,
"name": "xxxx",
"content": "xxxxx."
},
{
"id": 1787,
"name": "xxxxx",
"content": "xxxx"
}
]
编辑:
我再次为这个问题搜索了很多。这是一个常见的问题。有些人也遇到过类似的情况。我在这篇文章的底部添加了链接。
看来这是 RestTemplate 正确处理泛型的错误。有办法解决这个问题。
在这里我想知道,为什么当restTemplate返回并分配给它时它不会抛出异常ArrayList<LinkedHashMap>
List<Template>
?它们是不同的类型。这有点像 assgin 一个 int 到一个字符串。
我想泛型类型有一些魔力。有人可以详细介绍一下吗?谢谢。
无法获取泛型 ResponseEntity<T>,其中 T 是泛型类“SomeClass<SomeGenericType>”
解决方案
这是您获得的 JSON 响应List<Template>
或 Array of 中的问题Template
,但在responseType
您刚刚指定的ArrayList
地方,杰克逊不知道ArrayList
它是哪种类型
限制见限制
getForEntity(URI url, Class<T> responseType)
这使用 GET 动词向指定的 URI 发送请求,并将响应正文转换为请求的 Java 类型。这对大多数类都很有效,但它有一个限制:我们无法获取对象列表。
一种方法很简单,只需指定数组类型
Template[] list = restTemplate.getForEntity(urlFullTemplates, Template[].class).getBody();
或者使用换货方式
推荐阅读
- c++ - 'View v' 类型不完整,无法定义 C++
- ios - 在 swift5 中:iPad 上的弹出窗口大小合适,但在 iPhone 上却使用全屏?
- jdbc - PostgreSQL JDBC 接收器引发错误 null(Array) 类型没有到 SQL 数据库列类型的映射
- c - 关于使用命令行设置vino
- c# - 使用 ContentControl 将图片附加到 Word
- javascript - PHP base64_decode 无法解码完整的 javascript btoa 编码
- linux - packet_write_wait:连接到@host 端口 22:管道损坏
- python - 使用python在字典中迭代
- node.js - MacOS本地不同的NodeJS,如何找到并删除它们?
- python - 找不到上传图片的方法(与元素交互)