2012-12-11 4 views
18

Bitte helfen Sie mir, eine ResponseEntity<T> zu bekommen, wo T selbst ein generischer Typ ist. Wie ich es jetzt sehe, wird dies heute von Spring RestTemplate nicht unterstützt. Ich verwende Spring MVC Version 3.1.2Kann keine generische ResponseEntity <T> bekommen, wo T eine generische Klasse ist "SomeClass <SomeGenericType>"

Hier ist mein Code, dass ich verwenden möchte: Code:

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

Ich erhalte diese Fehlermeldung:

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

Es ist offensichtlicher Fehler, aber wie kann ich es heute umgehen?

als ich möchte, dass meine allgemeine Antwort Art erhalten:

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

Vorerst verwende ich diese Lösung mit postForObject() und nicht postForEntity():

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

Antwort

31

Das war a known issue. Jetzt ist es mit der Einführung von ParameterizedTypeReference, die eine parametrisierte Art ist, die Sie erben erben, um Typinformationen zur Laufzeit zu liefern, behoben. Dies nennt man Super-Typ-Token, und arbeitet um Typ löschen, weil Unterklassen (in diesem Fall anonym) halten die Typ Argumente des generischen Supertyp zur Laufzeit.

jedoch nicht postForObject verwenden können, da die API exchange() unterstützt nur:

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

Beachten Sie, dass die letzte Zeile die Idee super type tokens demonstriert: Sie die wörtliche CisResponse.class nicht liefern, sondern ein anonymer Instanziierung des parametrierten Typs ParameterizedTypeReference<T>, von dem zur Laufzeit erwartet werden kann, dass er Untertypinformationen extrahiert. Sie können als Hacks von Super-Typ-Token denken für Foo<Bar<Baz>>.class Erreichen

BTW, in Java müssen Sie nicht mit this Zugriff auf Instanzvariablen Präfix: Wenn Ihr Objekt ein url und template Mitglieder definiert, greifen sie nur mit ihr einfacher Name, und nicht durch Voranstellen wie Sie this.url und this.template

+0

Erstaunlich, haben Sie meinen Tag !! – IgorA

Verwandte Themen