2014-05-15 11 views

Odpowiedz

140

Może w ten sposób ...

ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity(urlGETList, Object[].class); 
Object[] objects = responseEntity.getBody(); 
MediaType contentType = responseEntity.getHeaders().getContentType(); 
HttpStatus statusCode = responseEntity.getStatusCode(); 

kod Controller dla RequestMapping

@RequestMapping(value="/Object/getList/", method=RequestMethod.GET) 
public @ResponseBody List<Object> findAllObjects() { 

    List<Object> objects = new ArrayList<Object>(); 
    return objects; 
} 

ResponseEntity jest przedłużeniem HttpEntity który dodaje kod HttpStatus stanu. Używane w metodach RestTemplate oraz . W tej klasie jest zwracana przez getForEntity() i exchange().

+0

To zadziałało jak wdzięk, dziękuję. Może możesz skierować mnie do innych tutoriali lub poradników, które mogę przeczytać na ten temat? – Karudi

+2

najlepiej przyjrzeć się tutaj na stackoverflow dla niektórych fragmentów kodu i przykładów lub odwiedzić stronę internetową wiosny wiosna ...... TblGps [] a = responseEntity.getBody(); – kamokaze

+0

Czy jest to możliwe przy użyciu generycznych? tj. moja metoda ma parametr klasy i chciałbym uzyskać kolekcję T z metody getForEntity. – Diskutant

55

Dla mnie to działało

Object[] forNow = template.getForObject("URL", Object[].class); 
    searchList= Arrays.asList(forNow); 

Gdzie jest klasa Object chcesz

+12

Działa to, nawet jeśli używasz klasy, a nie obiektów takich jak kupon Kupon = kupon = restTemplate.getForObject (\t adres URL, kupon []. Class) '' ' – lrkwz

+0

Może to spowodować NPE, jeśli treść odpowiedzi HTTP była pusta (nie '[]', ale całkowicie puste). Bądź więc ostrożny i sprawdź 'null' (' if (forNow! = Null) ...). – djxak

0

znalazłem pracę wokół z tego postu https://jira.spring.io/browse/SPR-8263.

Bazując na tym stanowisku można powrócić wpisywanych listy tak:

ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId); 
+4

To nie zadziała, ponieważ z powodu wymazania nie ma informacji o parametrach przekazywanych do 'getForEntity'. Również '(Class >) ArrayList.class' daje błąd kompilacji" niekompatybilnych typów ". –

196

pierwsze zdefiniować obiekt posiadać podmiot wraca w tablicy np ..

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Rate { 
    private String name; 
    private String code; 
    private Double rate; 
    // add getters and setters 
} 

Następnie można konsumować usługę i uzyskać silnie typami listy poprzez:

ResponseEntity<List<Rate>> rateResponse = 
     restTemplate.exchange("https://bitpay.com/api/rates", 
        HttpMethod.GET, null, new ParameterizedTypeReference<List<Rate>>() { 
      }); 
List<Rate> rates = rateResponse.getBody(); 

Pozostałe rozwiązania powyżej będą również pracować, ale jak się silnie typami listy z powrotem zamiast Object [ ].

+4

Ten bieg płynnie z wiosną 4.2.3 i - jak powiedział Matt - ma wielką zaletę unikania Obiektu [] – Marged

+0

@Matt - który marshaller używasz do sondowania jsonów do obiektów Rate? Zgaduję, że to się dzieje tutaj, w czasie 'resztaTemplate.exchange' marszałkownik odwzorowuje wszystkie wartości Json na pasujące nazwy kluczy jako właściwości w obiekcie Rate. Mam nadzieję, że mój proces myślowy jest poprawny. – Nirmal

+0

Doskonały, działa dobrze w Spring Boot 1.4.0.RELEASE Thanks – Anand

3

Po wielu testach, jest to najlepszy sposób znalazłem :)

Set<User> test = httpService.get(url).toResponseSet(User[].class); 

Wszystko trzeba tam

public <T> Set<T> toResponseSet(Class<T[]> setType) { 
    HttpEntity<?> body = new HttpEntity<>(objectBody, headers); 
    ResponseEntity<T[]> response = template.exchange(url, method, body, setType); 
    return Sets.newHashSet(response.getBody()); 
} 
0

Mam duży problem tutaj było zbudowanie struktury obiektu wymagane, aby dopasować do RestTemplate kompatybilna klasa. Na szczęście znalazłem http://www.jsonschema2pojo.org/ (uzyskaj odpowiedź JSON w przeglądarce i używaj jej jako wejścia) i nie mogę tego wystarczająco polecić!