Les méthodes de RestTemplate
telles que postForEntity()
throw RestClientException
. Je voudrais extraire le code d'état HTTP et le corps de réponse de cet objet d'exception dans le bloc catch. Comment puis je faire ça?
Au lieu d'attraper RestClientException
, attrapez le spécial HttpClientErrorException
.
Voici un exemple:
try {
Link dataCenterLink = serviceInstance.getLink("dataCenter");
String dataCenterUrl = dataCenterLink.getHref();
DataCenterResource dataCenter =
restTemplate.getForObject(dataCenterUrl, DataCenterResource.class);
serviceInstance.setDataCenter(dataCenter);
} catch (HttpClientErrorException e) {
HttpStatus status = e.getStatusCode();
if (status != HttpStatus.NOT_FOUND) { throw e; }
}
HttpClientErrorException
fournit getStatusCode
et getResponseBodyAsByteArray
pour obtenir le code d'état et le corps, respectivement .
Dans certains cas, HttpClientErrorException n'est pas levé. Par exemple, la méthode suivante restTemplate.exchange :
ResponseEntity<Employee[]> employees = restTemplate.exchange(url, HttpMethod.GET, entity, Employee[].class);
Obtenez le corps http et marshall vers une entité. Si la ressource distante renvoie une erreur rare, le marshall interne ne fonctionne pas et juste une exception RestClientException est levée.
Dans ce cas ou si vous souhaitez gérer toute erreur dans les opérations restTemplate , vous pouvez utiliser setErrorHandler . Cette méthode reçoit un ResponseErrorHandler de base avec des méthodes utiles.
Cette méthode hasError m'a permis d'obtenir le texte du corps http distant et m'a aidé à détecter l'erreur de l'invocation ou dans la ressource distante http distante:
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse arg0) throws IOException {
System.out.println("StatusCode from remote http resource:"+arg0.getStatusCode());
System.out.println("RawStatusCode from remote http resource:"+arg0.getRawStatusCode());
System.out.println("StatusText from remote http resource:"+arg0.getStatusText());
String body = new BufferedReader(new InputStreamReader(arg0.getBody()))
.lines().collect(Collectors.joining("\n"));
System.out.println("Error body from remote http resource:"+body);
return false;
}
@Override
public void handleError(ClientHttpResponse arg0) throws IOException {
// do something
}
});
Vous pouvez également évaluer manuellement le corps ou l'état et retourner vrai ou faux afin de signaler comme erreur ou non.
Attrapez RestClientResponseException
à la place. C'est plus générique.
À partir de docs : classe de base commune pour les exceptions qui contiennent des données de réponse HTTP réelles.