1. ホーム
  2. spring

[解決済み] Spring Resttemplateの例外処理

2022-05-01 19:40:37

質問

基本的に、私はエラーコードが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();
            }

しかし、サーバーから500の応答があった場合、次のような例外が発生します。

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]

残りのテンプレート交換メソッドをtryで包む必要が本当にあるのでしょうか?そうすると、コードの目的は何でしょうか?

解決方法は?

を実装したクラスを作りたい。 ResponseErrorHandler を作成し、そのインスタンスを使用して、レストテンプレートのエラー処理を設定します。

public class MyErrorHandler implements ResponseErrorHandler {
  @Override
  public void handleError(ClientHttpResponse response) throws IOException {
    // your error handling here
  }

  @Override
  public boolean hasError(ClientHttpResponse response) throws IOException {
     ...
  }
}

[...]

public static void main(String args[]) {
  RestTemplate restTemplate = new RestTemplate();
  restTemplate.setErrorHandler(new MyErrorHandler());
}

また、Springにはクラス DefaultResponseErrorHandler をオーバーライドしたいだけなら、 インターフェイスを実装する代わりにそれを拡張することができます。 handleError メソッドを使用します。

public class MyErrorHandler extends DefaultResponseErrorHandler {
  @Override
  public void handleError(ClientHttpResponse response) throws IOException {
    // your error handling here
  }
}

その ソースコード を使うと、SpringがHTTPエラーをどのように処理するのかがわかります。