java - objects - spring create resttemplate
Obtener una lista de objetos JSON con Spring RestTemplate (6)
Después de múltiples pruebas, esta es la mejor forma que encontré :)
Set<User> test = httpService.get(url).toResponseSet(User[].class);
Todo lo que necesitas allí
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());
}
Tengo dos preguntas:
- Cómo mapear una lista de objetos JSON utilizando Spring RestTemplate.
- Cómo mapear objetos JSON anidados.
Estoy intentando consumir https://bitpay.com/api/rates , siguiendo el tutorial de http://spring.io/guides/gs/consuming-rest/ .
Encontré trabajo en esta publicación https://jira.spring.io/browse/SPR-8263 .
Según esta publicación, puede devolver una lista mecanografiada como esta:
ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);
Mi gran problema aquí fue construir la estructura Object necesaria para unir RestTemplate a una clase compatible. Afortunadamente, encontré http://www.jsonschema2pojo.org/ (obtenga la respuesta JSON en un navegador y utilícela como entrada) ¡y no puedo recomendarlo lo suficiente!
Para mí esto funcionó
Object[] forNow = template.getForObject("URL", Object[].class);
searchList= Arrays.asList(forNow);
Donde Object es la clase que quieres
Primero defina un objeto para mantener a la entidad regresando en la matriz. Por ejemplo,
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rate {
private String name;
private String code;
private Double rate;
// add getters and setters
}
Luego puede consumir el servicio y obtener una lista fuertemente tipada a través de:
ResponseEntity<List<Rate>> rateResponse =
restTemplate.exchange("https://bitpay.com/api/rates",
HttpMethod.GET, null, new ParameterizedTypeReference<List<Rate>>() {
});
List<Rate> rates = rateResponse.getBody();
Las otras soluciones anteriores también funcionarán, pero me gusta obtener una lista fuertemente tipada en lugar de un Objeto [].
Quizás de esta manera ...
ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity(urlGETList, Object[].class);
Object[] objects = responseEntity.getBody();
MediaType contentType = responseEntity.getHeaders().getContentType();
HttpStatus statusCode = responseEntity.getStatusCode();
Código de controlador para RequestMapping
@RequestMapping(value="/Object/getList/", method=RequestMethod.GET)
public @ResponseBody List<Object> findAllObjects() {
List<Object> objects = new ArrayList<Object>();
return objects;
}
ResponseEntity
es una extensión de HttpEntity
que agrega un código de estado HttpStatus
. Usado en RestTemplate
y en los métodos @Controller
. En RestTemplate
getForEntity()
e exchange()
RestTemplate
esta clase.