responseentity objects getforobject getforentity exchange java spring generics jackson resttemplate

java - objects - Genéricos con Spring RESTTemplate



resttemplate getforobject list object (4)

Lo único que creo que podrías hacer es crear una nueva clase que extienda Wrapper y use el modelo como genérico.

class WrapperWithModel extends Wrapper<Model>{}; WrapperWithModel response = restTemplate.getForObject(URL, WrapperWithModel.class);

No es la mejor solución, pero al menos no tendrá que deshacer manualmente la respuesta.

Tengo una clase como esa:

public class Wrapper<T> { private String message; private T data; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } }

y uso resttemplate de la siguiente manera:

... Wrapper<Model> response = restTemplate.getForObject(URL, Wrapper.class, myMap); Model model = response.getData(); ...

Sin embargo, arroja un:

ClassCastException

Lo leí: Problema al intentar usar Jackson en Java pero no ayudó. Hay algunos temas relacionados con mi problema, etc .: https://jira.springsource.org/browse/SPR-7002 y https://jira.springsource.org/browse/SPR-7023

¿Algunas ideas?

PD: Mi error es que:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to a.b.c.d.Model

Creo que resttemplate no puede entender mi variable genérica y quizás la acepte como un Object en lugar de una T. genérica. Entonces se convierte en LinkedHashMap. Puedes leer here Dice eso cuando explicas de qué se trata:

Tipo JSON | Tipo de Java

objeto | LinkedHashMap


No necesitas ni siquiera una envoltura para esto. Prueba esto.

/** * * Method for GET Operations * * @param url url to send request * @return returned json String * @throws Exception exception thrown */ public List<T> getJSONString(String url, Class<T[]> clazz) throws Exception { logger.debug("getJSONString() : Start"); List<T> response = null; ResponseEntity<T[]> responseEntity = null; List<String> hostList = Arrays.asList(propertyFileReader.getRestApiHostList().split("//s*,//s*")); Iterator<String> hostListIter = hostList.iterator(); String host = null; while (true) { try { host = hostListIter.next(); logger.debug("getJSONString() : url={}", (host + url)); responseEntity = restTemplate.getForEntity(host + url, clazz); if (responseEntity != null) { response = Arrays.asList(responseEntity.getBody()); break; } } catch (RestClientException ex) { if (!hostListIter.hasNext()) { throw ex; } logger.debug("getJSONString() : I/O exception {} occurs when processing url={} ", ex.getMessage(), (host + url)); } } return response; }


No use genéricos con RestTemplate. Ajustar el objeto de solicitud y respuesta con el objeto envoltorio que ocultará los genéricos.


ParameterizedTypeReference se ha introducido en 3.2 M2 para solucionar este problema.

Wrapper<Model> response = restClient.exchange(loginUrl, HttpMethod.GET, null, new ParameterizedTypeReference<Wrapper<Model>>() {}).getBody();

Sin embargo, la variante postForObject / getForObject no se introdujo.