カテゴリ: Spring 更新日: 2026/02/03

SpringのWebClientとRestClientの例外処理を解説!タイムアウト・リトライ・フォールバック対応まとめ

WebClient/RestClient の例外処理:タイムアウト・リトライ・フォールバック
WebClient/RestClient の例外処理:タイムアウト・リトライ・フォールバック

先生と生徒の会話形式で理解しよう

生徒

「SpringのWebClientRestClientでAPI通信してると、たまにタイムアウトとかエラーが出るんですが、ちゃんと対処する方法ってありますか?」

先生

「はい、SpringではWebClientRestClientで外部APIと通信するときに、タイムアウトや接続エラーなどの例外処理をしっかり実装するのが大切です。さらにリトライやフォールバックの設定を入れると、より堅牢な設計になりますよ。」

生徒

「なるほど……それってどうやって実装するんですか?」

先生

「それでは、WebClientRestClientそれぞれの例外処理の基本から、リトライ・フォールバックの書き方まで見ていきましょう!」

1. WebClientの例外処理の基本

「1. WebClientの例外処理の基本」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. WebClientの例外処理の基本
1. WebClientの例外処理の基本

SpringのWebClientは非同期HTTP通信を行うための強力なツールで、リアクティブな開発に向いています。外部APIのレスポンスが遅い・エラーを返す・通信に失敗するといったケースでは、onErrorResumetimeoutを使って例外処理が可能です。


WebClient webClient = WebClient.create();

Mono<String> response = webClient.get()
    .uri("https://api.example.com/data")
    .retrieve()
    .bodyToMono(String.class)
    .timeout(Duration.ofSeconds(3))
    .onErrorResume(throwable -> {
        // タイムアウトや接続失敗時の処理
        return Mono.just("エラーが発生しました");
    });
    

このようにtimeoutを設定しておけば、APIの応答が遅い場合にもアプリがフリーズせず、onErrorResumeで代替処理ができます。

2. WebClientでのリトライとフォールバック

2. WebClientでのリトライとフォールバック
2. WebClientでのリトライとフォールバック

外部APIが一時的に不安定なときには、retryWhenを使ってリトライ処理を実装できます。リトライしても失敗する場合にはフォールバック処理を定義しておくと安心です。


webClient.get()
    .uri("https://api.example.com/data")
    .retrieve()
    .bodyToMono(String.class)
    .retryWhen(Retry.backoff(3, Duration.ofSeconds(2)))
    .onErrorResume(ex -> Mono.just("代替データ"));
    

retryWhenで最大3回、2秒間隔で再試行し、それでも失敗すればonErrorResumeでフォールバックの処理に入ります。

3. RestClientでの例外処理

3. RestClientでの例外処理
3. RestClientでの例外処理

RestClientはSpring 6から登場した新しい同期HTTPクライアントで、RestTemplateの後継とされています。こちらでも例外処理を入れることが大切です。


RestClient client = RestClient.create();

try {
    String result = client.get()
        .uri("https://api.example.com/data")
        .retrieve()
        .body(String.class);
} catch (HttpClientErrorException | HttpServerErrorException e) {
    // 4xx/5xxエラー
    System.out.println("HTTPエラー: " + e.getStatusCode());
} catch (ResourceAccessException e) {
    // タイムアウトや接続失敗
    System.out.println("接続エラー: " + e.getMessage());
}
    

RestClientでは同期的な実行となるため、try-catchブロックでしっかりエラーハンドリングを記述します。

4. タイムアウトの設定方法(WebClientとRestClient)

「4. タイムアウトの設定方法(WebClientとRestClient)」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. タイムアウトの設定方法(WebClientとRestClient)
4. タイムアウトの設定方法(WebClientとRestClient)

タイムアウト設定は、レスポンス待ちの無限ブロックを防ぐために重要です。WebClientではtimeoutをメソッドチェーンに入れ、RestClientでは下層のHTTPクライアント設定で制御します。


HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(3000); // 接続タイムアウト
factory.setReadTimeout(5000);    // 読み取りタイムアウト

RestClient client = RestClient.builder()
    .requestFactory(factory)
    .build();
    

ネットワークの状況やAPIの特性に合わせて適切に設定しましょう。

5. 例外ログの出力と監視のすすめ

5. 例外ログの出力と監視のすすめ
5. 例外ログの出力と監視のすすめ

例外が発生したとき、System.out.printlnだけでなく、Loggerを使ってログ出力することで、トラブル発見や監視システムとの連携が可能になります。ログレベルの設定や出力先の制御もできます。


private static final Logger logger = LoggerFactory.getLogger(MyService.class);

try {
    // 通常処理
} catch (Exception e) {
    logger.error("API通信でエラー", e);
}
    

SLF4JLogbackを組み合わせて、アプリ全体の可観測性を向上させましょう。

6. 例外処理を共通化するポイント

6. 例外処理を共通化するポイント
6. 例外処理を共通化するポイント

複数のAPIクライアントで同じような例外処理を書くと冗長になります。そのため、ExceptionHandlerや共通のユーティリティクラスを活用して、再利用性の高い例外処理コードにしていくと保守性が向上します。


public class ApiFallbackHandler {
    public static <T> Mono<T> fallback(Throwable ex, T defaultValue) {
        // ログ出力や通知処理も追加可能
        return Mono.just(defaultValue);
    }
}
    

このように共通化することで、異なるAPIごとに細かく制御しつつ、例外処理のパターンを統一できます。

カテゴリの一覧へ
新着記事
New1
Spring
SpringDataJPAのJPAクエリメソッド「Is」と「Equals」の使い方を完全ガイド!初心者向け解説
更新記事
New2
Spring
SpringDataJPAのJPAクエリメソッド「Or」の使い方を完全ガイド!初心者向け解説
更新記事
New3
Spring
SpringDataJPAのJPAクエリメソッド「And」の使い方を完全ガイド!初心者向け解説
更新記事
New4
Spring
SpringDataJPAのJPAクエリメソッド「Distinct」の使い方を完全ガイド!初心者向け解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleafのth:checkedの使い方!チェックボックスON/OFFを動的に制御する方法
No.3
Java&Spring記事人気No3
Java
Javaの抽象クラス(abstract)を完全ガイド!継承と設計のルールを学ぶ
No.4
Java&Spring記事人気No4
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.5
Java&Spring記事人気No5
Thymeleaf
Thymeleafのth:blockの使い方を完全ガイド!初心者でもわかるテンプレートブロック管理
No.6
Java&Spring記事人気No6
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.7
Java&Spring記事人気No7
Java
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
Spring
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方