我遇到了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类型的对象数组?
答案 0 :(得分:2)
我今天遇到了这个问题,这是我提出的解决方案(实际上,我的一位同事建议)。我们将它与返回List&lt; MyDto&gt;。
的接口一起使用调用RestTemplate时,请勿传入泛型类型
定义:public class MyDtoListTemplate extends ListTemplate<MyDto>
然后,拨打
MyDtoListTemplate template = restTemplate.getForObject("url", MyDtoListTemplate .class, mapOfPathVariables);
你必须定义一个扩展/实现泛型类型的具体类,但杰克森反序列化器可以获得通用信息,这真是一件令人失望的事。
答案 1 :(得分:1)
我记得我能够用Jackson 2对泛型类进行反序列化。在用它进行任何Http调用之前,我必须将MappingJackson2HttpMessageConverter转换器添加到RestTemplate。
RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
答案 2 :(得分:0)
不幸的是,据我所知,没有简单的方法可以做到这一点。问题是RestTemplate被告知期望哪种对象类型。只要此对象中的所有字段在json / xml中都有对应的元素,一切正常。在泛型的情况下,序列化程序不知道期望哪个类,所以它只是将它获得的地图转换为java Map。
如果您尝试使用getForObject作为通用返回类型,则会遇到同样的问题。