java 使用Spring RESTTemplate的泛型

qyuhtwio  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(129)

我有一个这样的班级:

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

我读到:Issue when trying to use Jackson in java但没有帮助。有一些主题与我的问题等有关: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

我认为resttemplate不能理解我的泛型变量,也许它接受它作为一个对象,而不是泛型T。所以它变成了一个LinkedHashMap。你可以从中读到here它说,当解释从什么它编组到:
JSON类型|Java类型
对象|LinkedHashMap

nhhxz33t

nhhxz33t1#

ParameterizedTypeReference已在3.2 M2中引入,以解决此问题。

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

然而,postForObject/getForObject变量没有被引入。

vu8f3i0k

vu8f3i0k2#

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

class WrapperWithModel extends Wrapper<Model>{};

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

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

p1tboqfb

p1tboqfb3#

不要在RestTemplate中使用泛型。使用将隐藏泛型的 Package 器对象 Package 请求和响应对象。

相关问题