2015-06-19 12 views
6

Mam odpowiedź z adresem URL, który wygląda tak:RestTemplate getForEntity mapa do listy obiektów

{"seq":1,"id":"Test1","changes":[{"rev":"1-52f5cdf008ecfbadf621c2939af7bd80"}]} 
{"seq":2,"id":"Test2","changes":[{"rev":"1-8ce403a89dc5e7cb4187a16941b3fb7d"}]} 
{"seq":3,"id":"Test3","changes":[{"rev":"1-52as7ddfd8ecfbadf621c2939af7bd80"}]} 
{"seq":4,"id":"Test4","changes":[{"rev":"1-6yy03a89dc5e7cb45677a16941b3fb7d"}]} 

Jeżeli obiekt jest odwzorowany String, potem coraz wszystkie zmiany paszy.

ResponseEntity<String> responseEntity = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, String.class); 

Natomiast jeśli zdarza mi się korzystać z własnego obiektu Value, latków, takie jak:

public class KnChanges { 
private long seq; 
private String id; 
private List changes; 

z getter i setter metod, to ja dostaję tylko pierwsze szczegóły zmian doc. Nawet jeśli używane są KnChanges [] (array), uzyskuje się tylko pierwszą zmianę.

Czy możesz pomóc, w jaki sposób wspomniana wyżej struktura list JSON może zostać odwzorowana na obiekt?

Dzięki Harsha

Odpowiedz

4
ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {}; 
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType); 
List<KnChanges> list = resp.getBody(); 
+7

Czy mógłbyś wyjaśnić swoją odpowiedź zamiast po prostu pisać kod? – bish

1

Niektórzy ludzie prosić o lepszą odpowiedź z jakiegoś wyjaśnieniu. Więc to jest tutaj:

Jak sujim wspomniano: Trzeba

ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {}; 
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType); 
List<KnChanges> list = resp.getBody(); 

wyjaśnieniu:

Ostatni parametr wywołania metody wymiany określa klasę, która dostaje instancję gdy odpowiedź jest otrzymywany. Dane odpowiedzi zostaną następnie odwzorowane na wynikowy obiekt. Więc potrzebujesz List.class w pierwszym miejscu. Ponieważ oczekujesz tablicy JSON. Teraz musisz zdefiniować typ zawartości tego List. Tutaj Java's type erasure rzuca kamienie na twoją drogę. Ponieważ Java usuwa ogólne informacje o typie podczas kompilacji, nie można po prostu zdefiniować oczekiwanego List jako List<KnChanges>.class. "Na szczęście" jest hack;) A ten hack to new ParameterizedTypeReference<List<KnChanges>>() {}. Pod warunkiem, że obiekt aplikacja będzie w stanie odczytać informacje o typie ogólnym w czasie wykonywania. I dlatego jest w stanie mapować odebrane dane do twoich obiektów Java.

Na marginesie: Istnieje kilka implementacji tego hackera. Jest powszechnie stosowany w systemach zastrzyków zależności lub mapowania, gdzie wymazywanie typów może czasami stanowić problem. Również Googles Guava oferuje wdrożenie. See the code, aby uzyskać więcej informacji. Tam możesz także dowiedzieć się, jak to się robi, jeśli chcesz.

Powiązane problemy