A continuación se muestra el fragmento de código; Básicamente, estoy tratando de propagar la excepción cuando el código de error no es 200.
ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version),
HttpMethod.POST, entity, Object.class);
if(response.getStatusCode().value()!= 200){
logger.debug("Encountered Error while Calling API");
throw new ApplicationException();
}
Sin embargo, en el caso de una respuesta 500 del servidor, obtengo la excepción
org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
¿Realmente necesito envolver el método de intercambio de plantilla restante en el intento? ¿Cuál sería entonces el propósito de los códigos?
spring
rest
exception-handling
resttemplate
vaibhav
fuente
fuente
Respuestas:
Desea crear una clase que implemente
ResponseErrorHandler
y luego usar una instancia de ella para configurar el manejo de errores de su plantilla de descanso:Además, Spring tiene la clase
DefaultResponseErrorHandler
, que puede extender en lugar de implementar la interfaz, en caso de que solo desee anular elhandleError
método.Eche un vistazo a su código fuente para tener una idea de cómo Spring maneja los errores HTTP.
fuente
ResourceAccessException
porqueRestTemplate.doExecute
atrapaIOException
sy lanza unResourceAccessException
. ¿Qué estoy haciendo mal?Debería detectar una
HttpStatusCodeException
excepción:fuente
Spring trata inteligentemente los códigos de error http como excepciones y asume que su código de manejo de excepciones tiene el contexto para manejar el error. Para que el intercambio funcione como lo esperaría, haga esto:
Esto devolverá todos los resultados esperados de la respuesta.
fuente
Otra solución es la que se describe aquí al final de esta publicación por "enlian": http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
fuente
Spring lo abstrae de la lista muy grande de código de estado http. Esa es la idea de las excepciones. Eche un vistazo a la jerarquía de org.springframework.web.client.RestClientException:
Tiene un montón de clases para mapear las situaciones más comunes cuando se trata de respuestas http. La lista de códigos http es muy grande, no querrá escribir código para manejar cada situación. Pero, por ejemplo, eche un vistazo a la subjerarquía HttpClientErrorException. Tiene una única excepción para asignar cualquier tipo de error 4xx. Si necesita profundizar, puede hacerlo. Pero con solo detectar HttpClientErrorException, puede manejar cualquier situación en la que se proporcionaron datos incorrectos al servicio.
DefaultResponseErrorHandler es realmente simple y sólido. Si el código de estado de respuesta no es de la familia 2xx, solo devuelve verdadero para el método hasError.
fuente
Si utiliza un mecanismo de agrupación (fábrica de clientes http) o de equilibrio de carga (eureka) con su
RestTemplate
, no podrá darse el lujo de crear unnew RestTemplate
por clase. Si llama a más de un servicio, no puede usarlosetErrorHandler
porque se usaría globalmente para todas sus solicitudes.En este caso, la captura
HttpStatusCodeException
parece ser la mejor opción.La única otra opción que tiene es definir varias
RestTemplate
instancias usando la@Qualifier
anotación.Además, pero este es mi propio gusto, me gusta que mi manejo de errores se adapte perfectamente a mis llamadas.
fuente
He manejado esto de la siguiente manera:
fuente
El código de intercambio está a continuación :
Excepción
RestClientException
tieneHttpClientErrorException
yHttpStatusCodeException
excepción.Así pues, en
RestTemplete
que puede aparecer dentroHttpClientErrorException
yHttpStatusCodeException
excepción. En el objeto de excepción, puede obtener un mensaje de error exacto de esta manera:exception.getResponseBodyAsString()
Aquí está el código de ejemplo :
Aquí está la descripción del código :
En este método, debe pasar la clase de solicitud y respuesta. Este método analizará automáticamente la respuesta como objeto solicitado.
En primer lugar, debe agregar el convertidor de mensajes.
Entonces tienes que agregar
requestHeader
. Aquí está el código:Finalmente, debes llamar al método de intercambio:
Para la impresión prety utilicé la biblioteca Gson. aquí está el gradle:
compile 'com.google.code.gson:gson:2.4'
Puede simplemente llamar al código de abajo para obtener respuesta:
Aquí está el código de trabajo completo :
Gracias :)
fuente
Una solución muy sencilla puede ser:
fuente
Aquí está mi método POST con HTTPS que devuelve un cuerpo de respuesta para cualquier tipo de respuesta incorrecta.
fuente