"-6ren"> "-请帮我获取 ResponseEntity在哪里 T本身就是一个泛型类型。正如我现在所看到的,spring RestTemplate 现在不支持这一点。我正在使用 Spring MVC 3.1.2 版 -6ren">
gpt4 book ai didi

java - 无法获取泛型 ResponseEntity,其中 T 是泛型类 "SomeClass"

转载 作者:IT老高 更新时间:2023-10-28 13:49:07 25 4
gpt4 key购买 nike

请帮我获取 ResponseEntity<T>在哪里 T本身就是一个泛型类型。正如我现在所看到的,spring RestTemplate 现在不支持这一点。我正在使用 Spring MVC 3.1.2 版

这是我想使用的代码:代码:

ResponseEntity<CisResponse<CisResponseEntity>> res =
this.restTemplate.postForEntity(
this.rootURL, myRequestObj, CisResponse.class);

我收到此错误:

Type mismatch: cannot convert from ResponseEntity<CisResponse> to
ResponseEntity<CisResponse<CisResponseEntity>>

这是明显的错误,但我今天该如何解决呢?

比我想得到我的通用响应类型:

CisResponse<CisResponseEntity> myResponse= res.getBody();
CisResponseEntity entity = myResponse.getEntityFromResponse();

目前,我使用此解决方案,与 postForObject()而不是 postForEntity() :

CisResponse<CisResponseEntity> response = 
this.restTemplate.postForObject(
this.rootURL,myRequestObj, CisResponse.class);

最佳答案

这是 a known issue .现在它已通过引入 ParameterizedTypeReference 得到修复,这是一种参数化类型,您明确继承以在运行时提供类型信息。这称为父类(super class)型标记,可以解决类型删除问题,因为子类(在这种情况下是匿名的)在运行时保留通用父类(super class)型的类型参数

但是你不能使用 postForObject , 因为 API 只支持 exchange() :

ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(
rootUrl,
HttpMethod.POST,
null,
new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});

请注意,最后一行演示了 super type tokens 的思想。 :您不提供文字 CisResponse.class , 而是参数化类型 ParameterizedTypeReference<T> 的匿名实例化,它可以在运行时提取子类型信息。您可以将父类(super class)型标记视为实现Foo<Bar<Baz>>.classhacks

顺便说一句,在 Java 中,您不需要在访问实例变量前加上 this : 如果你的对象定义了 urltemplate成员,只需使用他们的简单名称访问他们,而不是像您一样通过前缀 this.urlthis.template

关于java - 无法获取泛型 ResponseEntity<T>,其中 T 是泛型类 "SomeClass<SomeGenericType>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13819734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com