【问题标题】:Resttemplate unable to parse array of type TResttemplate 无法解析类型为 T 的数组
【发布时间】:2013-04-10 09:40:33
【问题描述】:

我遇到了 Spring 和 restTemplate 的问题。我想发送一个包含通用数组的对象(ListResponse)。辩解如下:

public class ListResponse<T> implements Serializable {

private long total;
private int page;
private int pageSize;
private T[] objects;

我使用 restTemplate.getForObject() 发送请求。结果,我得到了一个 ListResponse 类型的对象,但 objects 数组包含一个 LinkedHashMaps 数组,而不是一个 T 类型对象的数组。

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

我怎样才能确保我得到一个类型为 T 的对象数组?

【问题讨论】:

    标签: spring rest generics deserialization resttemplate


    【解决方案1】:

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

    调用 RestTemplate 时,不要传入泛型类型。
    定义:public class MyDtoListTemplate extends ListTemplate&lt;MyDto&gt;

    然后,拨打
    MyDtoListTemplate template = restTemplate.getForObject("url", MyDtoListTemplate .class, mapOfPathVariables);

    令人遗憾的是,您必须定义一个扩展/实现泛型类型的具体类,但是杰克逊反序列化器可以使用泛型信息。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        如果您尝试获取通用返回类型的 getForObject,您将遇到同样的问题。

        【讨论】:

        • 我可以想象 RestTemplate 不知道如何解析数组。但是您指定调用的返回类型需要来自 ListResponse 类型。通过指定这一点,它不应该能够知道数组中存储了什么类型的对象吗? (既然您指定了它?)无论如何,困难的方法是什么?我想知道它,所以我可以权衡它的利弊。
        • 当你声明一个预期的类型时,你通常会做类似的事情(例如,如果 T 假设是名为 MyClass 的类)-MyClass.class。你不能对泛型做同样的事情,比如ListResponse&lt;Feedback&gt;.class。我不确定是什么原因。我猜那是因为当你创建一个泛型类时,你会为一个实际上只在运行时创建的类创建一个模板(当设置类型时)。关于如何做到这一点 - 您可以自己执行反序列化。我做过一次,但我找不到要粘贴到这里的代码。这不应该是非常困难的。
        猜你喜欢
        • 2016-06-07
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 2013-12-14
        相关资源
        最近更新 更多