Unten ist das Code-Snippet; Im Grunde versuche ich, die Ausnahme zu verbreiten, wenn der Fehlercode etwas anderes als 200 ist.
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();
}
Bei einer Antwort von 500 vom Server erhalte ich jedoch die Ausnahme
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]
Muss ich die Methode zum Austausch von Restvorlagen wirklich in try umbrechen? Was wäre dann der Zweck von Codes?
spring
rest
exception-handling
resttemplate
Vaibhav
quelle
quelle
Antworten:
Sie möchten eine Klasse erstellen, die implementiert,
ResponseErrorHandler
und dann eine Instanz davon verwenden, um die Fehlerbehandlung Ihrer Restvorlage festzulegen:Außerdem verfügt Spring über die Klasse
DefaultResponseErrorHandler
, die Sie erweitern können, anstatt die Schnittstelle zu implementieren, falls Sie diehandleError
Methode nur überschreiben möchten .Schauen Sie sich den Quellcode an, um eine Vorstellung davon zu bekommen, wie Spring mit HTTP-Fehlern umgeht.
quelle
ResourceAccessException
weil sRestTemplate.doExecute
fängtIOException
und a wirftResourceAccessException
. Was mache ich falsch?Sie sollten eine
HttpStatusCodeException
Ausnahme abfangen :quelle
Spring behandelt http-Fehlercodes geschickt als Ausnahmen und geht davon aus, dass Ihr Ausnahmebehandlungscode den Kontext hat, um den Fehler zu behandeln. Gehen Sie folgendermaßen vor, damit der Austausch so funktioniert, wie Sie es erwarten würden:
Dadurch werden alle erwarteten Ergebnisse der Antwort zurückgegeben.
quelle
Eine andere Lösung ist die hier am Ende dieses Beitrags von "enlian" beschriebene: http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
quelle
Spring abstrahiert Sie von der sehr sehr sehr großen Liste des http-Statuscodes. Das ist die Idee der Ausnahmen. Schauen Sie sich die Hierarchie von org.springframework.web.client.RestClientException an:
Sie haben eine Reihe von Klassen, um die häufigsten Situationen beim Umgang mit http-Antworten abzubilden. Die Liste der http-Codes ist sehr umfangreich. Sie möchten nicht, dass Code für jede Situation geschrieben wird. Schauen Sie sich beispielsweise die Unterhierarchie HttpClientErrorException an. Sie haben eine einzige Ausnahme, um 4xx-Fehler zuzuordnen. Wenn Sie tief gehen müssen, dann können Sie. Mit nur dem Abfangen von HttpClientErrorException können Sie jedoch jede Situation bewältigen, in der dem Dienst fehlerhafte Daten bereitgestellt wurden.
Der DefaultResponseErrorHandler ist wirklich einfach und solide. Wenn der Antwortstatuscode nicht aus der Familie der 2xx stammt, gibt er nur true für die hasError-Methode zurück.
quelle
Wenn Sie einen Pooling-Mechanismus (http client factory) oder einen Lastausgleichsmechanismus (eureka) mit Ihrem verwenden
RestTemplate
, haben Sie nicht den Luxus, einennew RestTemplate
pro Klasse zu erstellen . Wenn Sie mehr als einen Dienst anrufen, können Sie ihn nicht verwenden,setErrorHandler
da er global für alle Ihre Anforderungen verwendet wird.In diesem Fall
HttpStatusCodeException
scheint es die bessere Option zu sein , das zu fangen .Die einzige andere Möglichkeit besteht darin,
RestTemplate
mithilfe der@Qualifier
Annotation mehrere Instanzen zu definieren .Auch - aber das ist mein eigener Geschmack - ich mag es, wenn sich meine Fehlerbehandlung eng an meine Anrufe schmiegt.
quelle
Ich habe das wie folgt gehandhabt:
quelle
Der Umtauschcode ist unten :
Ausnahme
RestClientException
hatHttpClientErrorException
undHttpStatusCodeException
Ausnahme.So in
RestTemplete
dort occure kannHttpClientErrorException
undHttpStatusCodeException
Ausnahme. Im Ausnahmeobjekt können Sie auf folgende Weise eine genaue Fehlermeldung erhalten:exception.getResponseBodyAsString()
Hier ist der Beispielcode :
Hier ist die Codebeschreibung :
Bei dieser Methode müssen Sie die Anforderungs- und Antwortklasse übergeben. Diese Methode analysiert die Antwort automatisch als angefordertes Objekt.
Zunächst müssen Sie den Nachrichtenkonverter hinzufügen.
Dann müssen Sie hinzufügen
requestHeader
. Hier ist der Code:Schließlich müssen Sie die Austauschmethode aufrufen:
Für den Prety-Druck habe ich die Gson-Bibliothek verwendet. hier ist der gradle:
compile 'com.google.code.gson:gson:2.4'
Sie können einfach den folgenden Code aufrufen, um eine Antwort zu erhalten:
Hier ist der vollständige Arbeitscode :
Vielen Dank :)
quelle
Eine sehr einfache Lösung kann sein:
quelle
Hier ist meine POST-Methode mit HTTPS, die einen Antworttext für jede Art von fehlerhaften Antworten zurückgibt.
quelle