postForEntity()
などのRestTemplate
のメソッドは、RestClientException
をスローします。キャッチブロックのその例外オブジェクトからHTTPステータスコードと応答本文を抽出したいと思います。どうやってやるの?
RestClientException
をキャッチする代わりに、特別なHttpClientErrorException
をキャッチします。
次に例を示します。
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
は、ステータスコードと本文をそれぞれ取得する getStatusCode
および getResponseBodyAsByteArray
を提供します。
HttpClientErrorExceptionがスローされない場合があります。たとえば、次のメソッドrestTemplate.exchange:
ResponseEntity<Employee[]> employees = restTemplate.exchange(url, HttpMethod.GET, entity, Employee[].class);
エンティティにhttpボディとマーシャルを取得します。リモートリソースがまれなエラーを返す場合、内部マーシャルは機能せず、RestClientExceptionがスローされます。
この場合、またはrestTemplate操作でエラーを処理する場合は、setErrorHandlerを使用できます。このメソッドは、基本的なResponseErrorHandlerと便利なメソッドを受け取ります。
このメソッドhasErrorを使用すると、リモートhttpの本文テキストを取得でき、呼び出しのエラーまたはリモートhttpリモートリソース内のエラーを検出できました。
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
}
});
また、手動で本文またはステータスを評価し、trueまたはfalseを返してエラーとしてフラグを立てるかどうかを指定できます。
代わりにRestClientResponseException
をキャッチしてください。より一般的です。
docs から:実際のHTTP応答データを含む例外の共通基本クラス。