web-dev-qa-db-ja.com

RestClientExceptionがスローされたときにHTTPステータスコードと応答本文を取得するにはどうすればよいですか?

postForEntity()などのRestTemplateのメソッドは、RestClientExceptionをスローします。キャッチブロックのその例外オブジェクトからHTTPステータスコードと応答本文を抽出したいと思います。どうやってやるの?

28
Vathanak

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 を提供します。

40
Willie Wheeler

HttpClientErrorExceptionがスローされない場合があります。たとえば、次のメソッドrestTemplate.exchange

ResponseEntity<Employee[]> employees =  restTemplate.exchange(url, HttpMethod.GET, entity, Employee[].class);

エンティティにhttpボディとマーシャルを取得します。リモートリソースがまれなエラーを返す場合、内部マーシャルは機能せず、RestClientExceptionがスローされます。

restTemplate.setErrorHandler

この場合、または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を返してエラーとしてフラグを立てるかどうかを指定できます。

1
JRichardsz

代わりにRestClientResponseExceptionをキャッチしてください。より一般的です。

docs から:実際のHTTP応答データを含む例外の共通基本クラス。

1
eosimosu