首页 > 解决方案 > 为什么 RestTemplate 返回 ArrayList而不是模型类型的真实列表?

问题描述

这是一个Springboot项目。代码片段如下。在第 59 行,所需的返回类型restTemplate.getForEntityList<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>”

在具有泛型参数的泛型方法中使用 Spring RestTemplate

RestTemplate:如何获得通用列表响应

标签: spring-bootresttemplate

解决方案


这是您获得的 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();

或者使用换货方式


推荐阅读