Igo*_*orA 22 java generics rest spring spring-mvc
请帮我弄一个ResponseEntity<T>地方T本身就是一个泛型类型.正如我现在所看到的,现在春天RestTemplate不支持这个.我正在使用Spring MVC 3.1.2版
这是我想要使用的代码:代码:
ResponseEntity<CisResponse<CisResponseEntity>> res =
this.restTemplate.postForEntity(
this.rootURL, myRequestObj, CisResponse.class);
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
Type mismatch: cannot convert from ResponseEntity<CisResponse> to
ResponseEntity<CisResponse<CisResponseEntity>>
Run Code Online (Sandbox Code Playgroud)
这是明显的错误,但我今天如何解决它?
比我想要获得我的通用响应类型:
CisResponse<CisResponseEntity> myResponse= res.getBody();
CisResponseEntity entity = myResponse.getEntityFromResponse();
Run Code Online (Sandbox Code Playgroud)
现在,我使用这个解决方案,postForObject()而不是postForEntity():
CisResponse<CisResponseEntity> response =
this.restTemplate.postForObject(
this.rootURL,myRequestObj, CisResponse.class);
Run Code Online (Sandbox Code Playgroud)
Raf*_*ele 40
这是一个众所周知的问题.现在它已经通过引入来修复ParameterizedTypeReference,这是一个参数化类型,您可以在运行时明确地继承它以提供类型信息.这称为超类型令牌,并且可以解决类型擦除问题,因为子类(在本例中是anoniymous)在运行时保留泛型超类型的类型参数.
但是您无法使用postForObject,因为API仅支持exchange():
ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(
rootUrl,
HttpMethod.POST,
null,
new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});
Run Code Online (Sandbox Code Playgroud)
请注意,最后一行演示了超类型令牌的概念:您不提供文字CisResponse.class,而是提供参数化类型的匿名实例化ParameterizedTypeReference<T>,在运行时可以提取子类型信息.您可以将超类型令牌视为实现的黑客Foo<Bar<Baz>>.class
顺便说一下,在Java中你不需要使用以下内容对实例变量进行前缀this:如果你的对象定义了一个url和template成员,只需用他们的简单名称访问它们,而不是像你那样使用前缀this.url和this.template
| 归档时间: |
|
| 查看次数: |
16787 次 |
| 最近记录: |