Spring RESTTemplate的泛型

kam*_*aci 59 java generics spring jackson resttemplate

我有一个这样的课:

public class Wrapper<T> {

 private String message;
 private T data;

 public String getMessage() {
    return message;
 }

 public void setMessage(String message) {
    this.message = message;
 }

 public T getData() {
    return data;
 }

 public void setData(T data) {
    this.data = data;
 }

}
Run Code Online (Sandbox Code Playgroud)

我使用resttemplate如下:

...
Wrapper<Model> response = restTemplate.getForObject(URL, Wrapper.class, myMap);
Model model = response.getData();
...
Run Code Online (Sandbox Code Playgroud)

然而它抛出一个:

ClassCastException
Run Code Online (Sandbox Code Playgroud)

我读到了:尝试在java中使用Jackson但没有帮助的问题.有一些与我的问题相关的主题等:https://jira.springsource.org/browse/SPR-7002https://jira.springsource.org/browse/SPR-7023

有任何想法吗?

PS:我的错误是:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model
Run Code Online (Sandbox Code Playgroud)

我认为resttemplate不能理解我的泛型变量,也许它接受它作为Object而不是泛型T.所以它变成了LinkedHashMap.你可以在这里阅读它说当从它的组合解释时:

JSON类型| Java类型

对象| LinkedHashMap的

小智 116

3.2 M2中引入了ParameterizedTypeReference来解决此问题.

Wrapper<Model> response = restClient.exchange(loginUrl, 
                          HttpMethod.GET, 
                          null, 
                          new ParameterizedTypeReference<Wrapper<Model>>() {}).getBody();
Run Code Online (Sandbox Code Playgroud)

但是,未引入postForObject/getForObject变体.

  • 为什么模型在这里不能也是通用的?等等,像这样:`Model&lt;InnerModel&gt;` (2认同)

Jua*_*uis 8

我认为你唯一能做的就是创建一个扩展Wrapper并使用model作为泛型的新类.

class WrapperWithModel extends Wrapper<Model>{};

WrapperWithModel response = restTemplate.getForObject(URL, WrapperWithModel.class);
Run Code Online (Sandbox Code Playgroud)

这不是最好的解决方案,但至少你不必手动解组响应.