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.