Nuestros programadores estrellas agotaron sus reservas de café, por su búsqueda diariamente por la solución, hasta que Ezequiel encontró el resultado en Bitbucket así que ahora la comparte contigo.
Solución:
Como se imaginaría, el problema es que el backend debería devolverle errores con códigos de error HTTP, para eso están ahí.
Pero como dijiste, no tienes control sobre el backend, así que lo que puedes hacer es obtenerlo primero como una cadena.
ResponseEntity dto = restTemplate.postForObject(url, postData, String.class);
A continuación, puede intentar analizar el string respuesta como un MainDTO
con Jackson o Gson (lo que sea que tengas en tu proyecto, lo cual deberías, porque creo que RestTemplate de Spring usa cualquiera de ellos internamente) con un intento/captura y si falla, entonces intentas analizarlo con tu ErrorDto
.
Actualizar
Oh, acabo de leer que era un XML
servicio, no un JSON
encendido, el enfoque anterior sigue siendo válido, pero en lugar de usar Jackson
o Gson
puedes usar SimpleXML
(http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize) que le permite deserializar XML de una manera “fácil”, solo necesita anotar sus modelos con sus anotaciones que son descritas en sus tutoriales y ejemplos.
El ejemplo de Spring (http://spring.io/guides/gs/Consuming-rest-xml-android/) también podría proporcionar una idea de cómo usar SimpleXML
.
Podrías implementar una costumbre ResponseErrorHandler
que convierte una respuesta errónea en una RuntimeException
. La conversión de mensaje Http a POJO se puede realizar reutilizando el(los) mensaje(s) Convertidor(es) del RestTemplate#setMessageConverters
esta usando.
Al final de todo puedes encontrar las notas de otros programadores, tú igualmente tienes el poder dejar el tuyo si dominas el tema.