请帮助我获得ResponseEntity<T>
T
本身就是一般类型。正如我现在所看到的,现在春天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);
答案 0 :(得分:37)
这是a known issue。现在通过引入ParameterizedTypeReference
来修复它,这是一个参数化类型,您明确地继承以在运行时提供类型信息。这称为超类型令牌,并且可以解决类型擦除问题,因为子类(在本例中是anoniymous)在运行时保留泛型超类型的类型参数。
但是,您无法使用postForObject
,因为API仅支持exchange()
:
ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(
rootUrl,
HttpMethod.POST,
null,
new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});
请注意,最后一行演示了super type tokens的概念:您不提供文字CisResponse.class
,而是提供参数化类型ParameterizedTypeReference<T>
的匿名实例化,它在运行时可以是期望提取子类型信息。您可以将超类型令牌视为 hacks 以实现Foo<Bar<Baz>>.class
BTW,在Java中,您不需要使用this
对实例变量的访问加前缀:如果您的对象定义了url
和template
成员,只需使用简单名称访问它们,而不是像this.url
和this.template