Spring Resttemplate无法分析T类型的数组
我面临Spring和restTemplate的问题。我想发送一个包含通用数组的对象(ListResponse)。辩护理由如下: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页面
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
。我不确定原因是什么。我想这是因为当你创建泛型类时,你为一个只在运行时创建的类创建了一个模板(当类型被设置时)。关于如何做到这一点-您可以自己执行反序列化。我做过一次,但我找不到要粘贴到此处的代码。这应该不是非常困难。