Voici l'extrait de code; en gros, j'essaye de propager l'exception lorsque le code d'erreur est autre que 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();
}
Cependant, dans le cas d'une réponse 500 du serveur, j'obtiens l'exception
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]
Ai-je vraiment besoin d'encapsuler la méthode d'échange de modèles rest dans try? Quel serait alors le but des codes?
Réponses:
Vous souhaitez créer une classe qui implémente
ResponseErrorHandler
, puis utiliser une instance de celle-ci pour définir la gestion des erreurs de votre modèle de repos:De plus, Spring a la classe
DefaultResponseErrorHandler
, que vous pouvez étendre au lieu d'implémenter l'interface, au cas où vous ne voudriez que remplacer lahandleError
méthode.Jetez un œil à son code source pour avoir une idée de la façon dont Spring gère les erreurs HTTP.
la source
ResourceAccessException
carRestTemplate.doExecute
attrapeIOException
s et jette unResourceAccessException
. Qu'est-ce que je fais mal?Vous devriez attraper une
HttpStatusCodeException
exception:la source
Spring traite intelligemment les codes d'erreur http comme des exceptions et suppose que votre code de gestion des exceptions a le contexte pour gérer l'erreur. Pour que l'échange fonctionne comme vous l'attendiez, procédez comme suit:
Cela renverra tous les résultats attendus de la réponse.
la source
Une autre solution est celle décrite ici à la fin de cet article par "enlian": http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
la source
Spring vous extrait de la très très très grande liste de codes d'état http. C'est l'idée des exceptions. Jetez un œil à la hiérarchie org.springframework.web.client.RestClientException:
Vous disposez de plusieurs classes pour cartographier les situations les plus courantes lors du traitement des réponses http. La liste des codes http est vraiment grande, vous ne voudrez pas écrire de code pour gérer chaque situation. Mais par exemple, jetez un œil à la sous-hiérarchie HttpClientErrorException. Vous avez une seule exception pour mapper tout type d'erreur 4xx. Si vous avez besoin d'aller en profondeur, vous le pouvez. Mais en attrapant simplement HttpClientErrorException, vous pouvez gérer toute situation où des données incorrectes ont été fournies au service.
Le DefaultResponseErrorHandler est vraiment simple et solide. Si le code d'état de la réponse ne fait pas partie de la famille 2xx, il renvoie simplement true pour la méthode hasError.
la source
Si vous utilisez un mécanisme de pooling (usine client http) ou d'équilibrage de charge (eureka) avec votre
RestTemplate
, vous n'aurez pas le luxe de créer unnew RestTemplate
par classe. Si vous appelez plus d'un service, vous ne pouvez pas utilisersetErrorHandler
car if serait globalement utilisé pour toutes vos demandes.Dans ce cas, attraper le
HttpStatusCodeException
semble être la meilleure option.La seule autre option dont vous disposez est de définir plusieurs
RestTemplate
instances à l'aide de l'@Qualifier
annotation.De plus, mais c'est mon goût personnel, j'aime que ma gestion des erreurs soit étroitement liée à mes appels.
la source
J'ai géré cela comme ci-dessous:
la source
Le code d'échange est ci-dessous :
L'exception
RestClientException
aHttpClientErrorException
et l'HttpStatusCodeException
exception.Donc,
RestTemplete
là-dedans peut se produireHttpClientErrorException
etHttpStatusCodeException
exception. Dans l'objet d'exception, vous pouvez obtenir un message d'erreur exact de cette manière:exception.getResponseBodyAsString()
Voici l'exemple de code :
Voici la description du code :
Dans cette méthode, vous devez passer la classe de demande et de réponse. Cette méthode analysera automatiquement la réponse en tant qu'objet demandé.
Tout d'abord, vous devez ajouter un convertisseur de message.
Ensuite, vous devez ajouter
requestHeader
. Voici le code:Enfin, vous devez appeler la méthode d'échange:
Pour l'impression prety, j'ai utilisé la bibliothèque Gson. voici le gradle:
compile 'com.google.code.gson:gson:2.4'
Vous pouvez simplement appeler le code ci-dessous pour obtenir une réponse:
Voici le code de travail complet :
Merci :)
la source
Une solution très simple peut être:
la source
Voici ma méthode POST avec HTTPS qui renvoie un corps de réponse pour tout type de mauvaises réponses.
la source