请帮助我得到一个ResponseEntity<T>where T本身就是一个泛型类型。如我现在所见,Spring RestTemplate现在不支持此功能。我正在使用Spring MVC版本3.1.2
ResponseEntity<T>
T
这是我要使用的代码:代码:
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():
postForObject()
postForEntity()
CisResponse<CisResponseEntity> response = this.restTemplate.postForObject( this.rootURL,myRequestObj, CisResponse.class);
通过引入修复了该问题ParameterizedTypeReference,你可以显式继承该参数化类型,以便在运行时提供类型信息。这被称为超类型令牌,可解决类型擦除的问题,因为子类(在这种情况下为匿名)在运行时保留通用超类型的类型参数。
ParameterizedTypeReference
但是,你不能使用postForObject,因为该API仅支持exchange():
postForObject
exchange()
ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange( rootUrl, HttpMethod.POST, null, new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});
请注意,最后一行演示了超级类型令牌的概念:你不提供文字CisResponse.class,而是提供参数化类型的匿名实例化ParameterizedTypeReference<T>,可以在运行时提取其子类型信息。你可以将超级类型令牌视为实现目标的技巧Foo<Bar<Baz>>.class
CisResponse.class
ParameterizedTypeReference<T>
Foo<Bar<Baz>>.class
顺便说一句,在Java中,你不需要使用以下前缀对实例变量进行访问this:如果你的对象定义了urland template成员,则只需使用其简单名称即可访问它们,而不必像你这样做时那样通过前缀this.url和this.template
this.url
this.template