无法获取通用ResponseEntity 其中T是泛型类“ SomeClass”

请帮助我获得一个ResponseEntity<T>where 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);

回答:

这是一个已知问题。现在,通过引入修复了此问题ParameterizedTypeReference,您可以显式

该参数化类型,以便在运行时提供类型信息。这称为 超类型令牌 ,它可解决类型擦除,因为子类(在这种情况下为匿名)在运行时保留

的 。

但是,您不能使用postForObject,因为该API仅支持exchange()

ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(

rootUrl,

HttpMethod.POST,

null,

new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});

请注意,最后一行演示了超级类型令牌的概念:您不提供文字CisResponse.class,而是提供参数化类型的匿名实例化ParameterizedTypeReference<T>,可以在运行时提取其子类型信息。您可以将超级类型令牌视为实现目标的

技巧Foo<Bar<Baz>>.class

顺便说一句,在Java中,您不需要使用以下前缀对实例变量进行访问this:如果您的对象定义了urltemplate成员,则只需使用其简单名称即可访问它们,而不必像您这样做时那样通过前缀this.urlthis.template

以上是 无法获取通用ResponseEntity 其中T是泛型类“ SomeClass” 的全部内容, 来源链接: utcz.com/qa/420185.html

回到顶部