La guía o código que encontrarás en este artículo es la resolución más fácil y válida que encontramos a esta duda o dilema.
Solución:
El comportamiento predeterminado de RestTemplate al encontrar códigos de respuesta de error genera una excepción. En el caso de 4xx es HttpClientErrorException
y en caso de 5xx: HttpServerErrorException
(ambos extendidos HttpStatusCodeException
). Spring logra eso usando ResponseErrorHandler (y su implementación predeterminada – DefaultResponseErrorHandler)
Una forma de manejar esto sería atraparlos:
try
ResponseEntity response = restTemplate.exchange(fruitBasketUrl, HttpMethod.POST, fruit, String.class);
catch(HttpClientErrorException e)
//handle 4xx errors
catch(HttpServerErrorException e)
//handle 5xx errors
Si necesita personalizar este comportamiento (algunas API de descanso usan esos códigos cuando envían respuestas legítimas a algunas solicitudes que luego puede querer procesar como lo hace con la respuesta 2xx), puede crear su propia implementación de ResponseErrorHandler
implementándolo o extendiéndolo DefaultResponseHandler
y luego registrando su controlador con RestTemplate durante su inicialización:
public class MyResponseErrorHandler extends DefaultResponseErrorHandler
@Override
public boolean hasError(ClientHttpResponse response) throws IOException
// check if response code is an error in here or just use default implementation
@Override
public void handleError(ClientHttpResponse response) throws IOException
// handle different response codes
// (default spring behaviour is throwing an exception)
Y registrando:
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new MyResponseErrorHandler());
// now RestTemplate's behaviour for error status codes is customized
No hay nada malo aquí. Esta excepción se lanzará si recibe un código de estado erróneo.
Solo necesita envolver su código del lado del cliente en un try-catch
y captura la excepción y luego haz lo que quieras con ella.
try
ResponseEntity response = restTemplate.exchange(fruitBasketUrl, HttpMethod.POST, fruit, String.class);
catch (HttpStatusCodeException e)
e.getMessage();
Comentarios y valoraciones
Te invitamos a favorecer nuestro trabajo añadiendo un comentario y puntuándolo te damos las gracias.