Mit Spring RestTemplate in generische Methode mit der generischen parameter

Verwendung generischer Typen mit Feder RestTemplate brauchen wir ParameterizedTypeReference (Nicht erhalten Sie eine Allgemeine ResponseEntity<T>, wo T ist eine generische Klasse "SomeClass<SomeGenericType>")

Denke, ich habe einige Klasse

public class MyClass {
    int users[];

    public int[] getUsers() { return users; }
    public void setUsers(int[] users) {this.users = users;}
}

Sowie einige wrapper-Klasse

public class ResponseWrapper <T> {
    T response;

    public T getResponse () { return response; }
    public void setResponse(T response) {this.response = response;}
}

Also, wenn ich versuche, so etwas zu tun, ist alles OK.

public ResponseWrapper<MyClass> makeRequest(URI uri) {
    ResponseEntity<ResponseWrapper<MyClass>> response = template.exchange(
        uri,
        HttpMethod.POST,
        null,
        new ParameterizedTypeReference<ResponseWrapper<MyClass>>() {});
    return response;
}

Aber wenn ich versuche zu erstellen, die generische Variante der oben beschriebenen Methode ...

public <T> ResponseWrapper<T> makeRequest(URI uri, Class<T> clazz) {
   ResponseEntity<ResponseWrapper<T>> response = template.exchange(
        uri,
        HttpMethod.POST,
        null,
        new ParameterizedTypeReference<ResponseWrapper<T>>() {});
    return response;
}

... und Sie diese Methode aufrufen, wie so ...

makeRequest(uri, MyClass.class)

... anstatt ResponseEntity<ResponseWrapper<MyClass>> Objekt ich bin immer ResponseEntity<ResponseWrapper<LinkedHashSet>> Objekt.

Wie kann ich dieses problem lösen? Ist es ein RestTemplate bug?

UPDATE 1
Dank @Sotirios ich das Konzept zu verstehen. Leider bin ich neu hier angemeldet so kann ich nicht kommentieren, seine Antwort, so schreibt es hier. Im nicht sicher, ob ich klar zu verstehen, wie die Umsetzung der vorgeschlagenen Ansatz um mein problem zu lösen mit Map mit Class Schlüssel (Vorgeschlagen von @Sotirios am Ende seiner Antwort). Würde jemand Verstand, um ein Beispiel zu geben?

Sie sollten immer in der Lage sein, um kommentieren Sie die Antworten auf Ihre Fragen. Die vorgeschlagene Lösung funktioniert wie folgt. Erstellen Sie eine Map<Class, ParameterizedTypeReference<ResponseWrapper<?>>>. Fügen Sie pre-konstruiert ParameterizedTypeReference Instanzen für die eigentlichen Typen, die Sie erwarten, dass die Map für die entsprechenden Class.
Können Sie formulieren für jemanden, der neu für Java? Ich komme aus der C# - hintergrund, das war also eine sehr interessante Erfahrung für mich.

InformationsquelleAutor Artyom Kozhemiakin | 2014-02-24

Schreibe einen Kommentar