具有 Spring RESTTemplate 的泛型

2022-08-31 11:57:58

我有一个这样的类:

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;
 }

}

我使用 resttemplate,如下所示:

...
Wrapper<Model> response = restTemplate.getForObject(URL, Wrapper.class, myMap);
Model model = response.getData();
...

但是,它抛出了一个:

ClassCastException

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

有什么想法吗?

附言:我的错误是:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model

我认为 resttemplate 无法理解我的泛型变量,也许它接受它作为对象而不是泛型 T。所以它变成了一个LinkedHashMap。你可以从这里读到它说,当解释从它元帅到什么时:

JSON 类型 |Java 类型

对象|LinkedHashMap


答案 1

3.2 M2 中引入了参数化类型引用来解决此问题。

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

但是,没有引入 postForObject/getForObject 变体。


答案 2

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

class WrapperWithModel extends Wrapper<Model>{};

WrapperWithModel response = restTemplate.getForObject(URL, WrapperWithModel.class);

这不是最好的解决方案,但至少您不必手动取消响应。


推荐