response - headers - resttemplate timeout
RestTemplate-Manejo de encabezados/cuerpo de respuesta en Excepciones(RestClientException, HttpStatusCodeException) (2)
Finalmente lo hice usando ResponseErrorHandler.
public class CustomResponseErrorHandler implements ResponseErrorHandler {
private static ILogger logger = Logger.getLogger(CustomResponseErrorHandler.class);
private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();
public void handleError(ClientHttpResponse response) throws IOException {
List<String> customHeader = response.getHeaders().get("x-app-err-id");
String svcErrorMessageID = "";
if (customHeader != null) {
svcErrorMessageID = customHeader.get(0);
}
try {
errorHandler.handleError(response);
} catch (RestClientException scx) {
throw new CustomException(scx.getMessage(), scx, svcErrorMessageID);
}
}
public boolean hasError(ClientHttpResponse response) throws IOException {
return errorHandler.hasError(response);
}
}
Y luego use este controlador de respuesta personalizado para RestTemplate configurando como se muestra a continuación
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
<property name="errorHandler" ref="customErrorHandler" />
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>
<bean id="customErrorHandler " class="my.package.CustomResponseErrorHandler">
</bean>
En mi servicio web reparador, en caso de solicitud incorrecta (5xx) o códigos de respuesta 4xx, escribo un encabezado personalizado "x-app-err-id" en la respuesta.
En el lado del cliente, uso el método de intercambio de RestTemplate para realizar una llamada al servicio web RestFul. Todo está bien cuando el código de respuesta es 2xx.
ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
HttpMethod.POST,
requestEntity,
Component.class);
Pero si hay una excepción (HttpStatusCodeException) debido a que es una solicitud incorrecta (5xx) o 4xx, en el bloque catch de HttpStatusCodeException, obtengo una respuesta (ver más arriba) como nula y no tengo acceso a mi encabezado personalizado. Establecer en mi servicio web. ¿Cómo obtengo encabezados personalizados de la respuesta en caso de excepciones en RestTemplate?
Una pregunta más es, establezco un objeto de error (json) en el cuerpo de respuesta en caso de error y me gustaría saber cómo acceder al cuerpo de respuesta también en caso de excepciones en RestTemplate
No debería tener que crear un controlador de errores personalizado. Puede obtener el cuerpo y los encabezados de la HttpStatusCodeException que se lanza.
try {
ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
HttpMethod.POST,
requestEntity,
Component.class);
} catch (HttpStatusCodeException e) {
List<String> customHeader = e.getResponseHeaders().get("x-app-err-id");
String svcErrorMessageID = "";
if (customHeader != null) {
svcErrorMessageID = customHeader.get(0);
}
throw new CustomException(e.getMessage(), e, svcErrorMessageID);
// You can get the body too but you will have to deserialize it yourself
// e.getResponseBodyAsByteArray()
// e.getResponseBodyAsString()
}