Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Resttemplate无法分析T类型的数组_Spring_Rest_Generics_Deserialization_Resttemplate - Fatal编程技术网

Spring Resttemplate无法分析T类型的数组

Spring Resttemplate无法分析T类型的数组,spring,rest,generics,deserialization,resttemplate,Spring,Rest,Generics,Deserialization,Resttemplate,我面临Spring和restTemplate的问题。我想发送一个包含通用数组的对象(ListResponse)。辩护理由如下: public class ListResponse<T> implements Serializable { private long total; private int page; private int pageSize; private T[] objects; 公共类ListResponse实现可序列化{ 私人长总; 私人网页; 私有int页面

我面临Spring和restTemplate的问题。我想发送一个包含通用数组的对象(ListResponse)。辩护理由如下:

public class ListResponse<T> implements Serializable {

private long total;
private int page;
private int pageSize;
private T[] objects;
公共类ListResponse实现可序列化{
私人长总;
私人网页;
私有int页面大小;
私人物品;
我使用restTemplate.getForObject()发送了一个请求。因此,我得到了一个ListResponse类型的对象,但对象数组包含LinkedHashMaps数组,而不是包含T类型对象的数组

restTemplate似乎无法将数组中的元素转换为正确的类型


如何确保返回类型为T的对象数组?

不幸的是,据我所知,没有一种简单的方法可以实现这一点。问题是RestTemplate被告知应该使用哪种对象类型。只要此对象中的所有字段在json/xml中都有相应的元素,一切都可以正常工作。对于泛型,则序列化程序不知道应该使用哪个类,所以它只是将得到的映射转换为java映射


如果您尝试为泛型返回类型获取ForObject,您也会遇到同样的问题。

我记得我能够使用Jackson 2反序列化泛型类。在使用RestTemplate进行任何Http调用之前,我必须将转换器添加到RestTemplate

RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

我今天遇到了这个问题,下面是我提出的解决方案(实际上,是我的一位同事建议的)。我们将它与一个返回列表的接口一起使用

调用RestTemplate时,不要传入泛型类型。
定义:
公共类MyDtoListTemplate扩展ListTemplate

然后,致电

MyDtoListTemplate=restTemplate.getForObject(“url”,MyDtoListTemplate.class,mapOfPathVariables);


很遗憾,您必须定义一个扩展/实现泛型类型的具体类,但是jackson反序列化程序可以使用泛型信息。

我可以想象RestTemplate不知道如何解析数组。但是您指定调用的返回类型需要来自类型ListResponse。按speci要说明这一点,难道它不应该知道数组中存储了什么类型的对象吗?(既然你指定了它?)不管怎样,最难的方法是什么?我想知道它,这样我就可以权衡它的利弊。当你声明一个预期的类型时,你通常会做一些类似的事情(例如,如果你不假设类名为MyClass)-
MyClass.class
。你不能对泛型做同样的事情,比如
ListResponse.class
。我不确定原因是什么。我想这是因为当你创建泛型类时,你为一个只在运行时创建的类创建了一个模板(当类型被设置时)。关于如何做到这一点-您可以自己执行反序列化。我做过一次,但我找不到要粘贴到此处的代码。这应该不是非常困难。