3

我遇到了 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 类型的对象数组?

4

3 回答 3

2

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

调用 RestTemplate 时,不要传入泛型类型。
定义: public class MyDtoListTemplate extends ListTemplate<MyDto>

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

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

于 2013-07-08T16:28:11.957 回答
1

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

RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
于 2013-04-14T03:22:04.600 回答
0

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

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

于 2013-04-10T22:48:03.090 回答