2012-12-11 29 views
18

請幫我弄個ResponseEntity<T>,其中T本身就是一個泛型類型。正如我現在看到的那樣,現在春天RestTemplate不支持這個功能。我使用Spring MVC的3.1.2版本無法獲得通用ResponseEntity <T>其中T是泛型類「SomeClass <SomeGenericType>」

這裏是我的代碼,我想用: 代碼:

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); 

回答

31

這是a known issue。現在通過引入ParameterizedTypeReference來解決這個問題,它是一個參數化類型,您明確地指定繼承以在運行時提供類型信息。這被稱爲超類型令牌,並且圍繞類型擦除工作,因爲子類(在這種情況下是匿名的)在運行時保持通用超類型的類型參數。

但是你不能使用postForObject,因爲API僅支持exchange()

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

注意,最後一行演示了super type tokens的想法:你不提供字面CisResponse.class,但一個匿名實例的參數化類型ParameterizedTypeReference<T>,在運行時可以預期提取子類型信息。你能想到的超類型令牌作爲黑客實現Foo<Bar<Baz>>.class

順便說一句,在Java中你不需要前綴訪問實例變量與this:如果你的對象定義了urltemplate會員,只是他們訪問他們的簡單名稱,而不是像你這樣做的前綴this.urlthis.template

+0

令人驚歎的,你讓我的一天! – IgorA

相關問題