2012-12-11 7 views
18

Please help me per ottenere uno ResponseEntity<T> dove T è esso stesso un tipo generico. Come lo vedo ora, questo non è supportato oggigiorno dalla molla RestTemplate. Sto usando la versione Spring MVC 3.1.2Impossibile ottenere un ResponseEntity generico <T> dove T è una classe generica "SomeClass <SomeGenericType>"

Ecco il mio codice, che voglio usare: Codice:

ResponseEntity<CisResponse<CisResponseEntity>> res = 
     this.restTemplate.postForEntity(
      this.rootURL, myRequestObj, CisResponse.class); 

sto ottenendo questo errore:

Type mismatch: cannot convert from ResponseEntity<CisResponse> to 
ResponseEntity<CisResponse<CisResponseEntity>> 

E ' errore evidente, ma come posso risolverlo oggi?

di me voglio avere il mio tipo di risposta generica:

CisResponse<CisResponseEntity> myResponse= res.getBody(); 
CisResponseEntity entity = myResponse.getEntityFromResponse(); 

Per ora, Io uso questa soluzione, con postForObject() e non postForEntity():

CisResponse<CisResponseEntity> response = 
      this.restTemplate.postForObject(
       this.rootURL,myRequestObj, CisResponse.class); 

risposta

31

Questo è stato a known issue. Ora è stato corretto con l'introduzione di ParameterizedTypeReference, che è un tipo parametrizzato che è esplicitamente ereditare per fornire informazioni sul tipo in fase di esecuzione. Questo è chiamato token di tipo e si occupa della cancellazione dei caratteri perché le sottoclassi (anoniymous in questo caso) mantengono gli argomenti di tipo del supertipo genetico in fase di runtime.

Tuttavia non è possibile utilizzare postForObject, perché l'API supporta solo exchange():

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

Si noti che l'ultima linea dimostra l'idea di super type tokens: non si fornisce letterale CisResponse.class, ma un'istanza anonima del tipo parametrizzato ParameterizedTypeReference<T>, che in fase di esecuzione può essere previsto estrarre informazioni di sottotipo. Si può pensare di gettoni di tipo super come hack per il raggiungimento Foo<Bar<Baz>>.class

BTW, in Java non è necessario anteporre l'accesso alla variabile di istanza con this: se il vostro oggetto definisce un url e template membri, basta accedere con il loro nome semplice, e non prefisso come fai tu this.url e this.template

+0

Incredibile, hai reso la mia giornata !! – IgorA

Problemi correlati