カテゴリ: Spring 更新日: 2026/01/25

Springの@ControllerAdviceと@ExceptionHandlerの使い方を完全ガイド!初心者でもわかる例外処理の基本

@ControllerAdvice と @ExceptionHandler:グローバル例外ハンドリングの実装
@ControllerAdvice と @ExceptionHandler:グローバル例外ハンドリングの実装

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

生徒

「Springでコントローラーの処理中にエラーが起きたとき、全部にtry-catchを書かないといけないんですか?」

先生

「それは大変ですよね。でもSpringには共通の例外処理を一箇所にまとめられる@ControllerAdviceという便利な仕組みがあります。」

生徒

「それって、全体のエラーハンドリングが簡単になるってことですか?」

先生

「そうなんです。さらに、@ExceptionHandlerと組み合わせると、例外の種類ごとに丁寧な対応ができますよ。詳しく見ていきましょう!」

1. Springの例外処理とは?初心者向けにわかりやすく解説

「1. Springの例外処理とは?初心者向けにわかりやすく解説」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. Springの例外処理とは?初心者向けにわかりやすく解説
1. Springの例外処理とは?初心者向けにわかりやすく解説

Spring Frameworkでは、アプリケーション中で発生する例外(エラー)を効率よく処理する方法として、@ControllerAdvice@ExceptionHandlerを使った「グローバル例外処理」がよく使われます。これは、全体のコントローラーに共通する例外処理を一元化し、メンテナンス性の向上コードの簡略化に役立ちます。

例えば、Webアプリケーションでユーザーが存在しないIDを指定してアクセスしたときや、バリデーションエラーが起きたときに、それぞれ適切なエラーメッセージを返す処理が可能です。

2. @ControllerAdviceの基本と役割

2. @ControllerAdviceの基本と役割
2. @ControllerAdviceの基本と役割

@ControllerAdviceは、複数の@Controllerに共通する処理をまとめるためのアノテーションです。例外処理だけでなく、バインディングエラーの処理なども扱えますが、今回は例外処理に特化して解説します。

グローバルなエラーハンドリングを実現するには、以下のようにクラスに@ControllerAdviceを付けて定義します。


@ControllerAdvice
public class GlobalExceptionHandler {
    // 例外ハンドラをここに記述
}

このクラス内に@ExceptionHandlerを使ったメソッドを定義することで、アプリ全体の例外を一箇所で処理できます。

3. @ExceptionHandlerで例外をキャッチする方法

3. @ExceptionHandlerで例外をキャッチする方法
3. @ExceptionHandlerで例外をキャッチする方法

@ExceptionHandlerは、特定の例外クラスに対する処理を記述するためのアノテーションです。たとえば、IllegalArgumentExceptionが発生したときに、指定したメソッドが呼ばれるようにできます。


@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgument(IllegalArgumentException ex) {
    return ResponseEntity.badRequest().body("不正なリクエストです:" + ex.getMessage());
}

上記のように記述すれば、例外に応じたエラーメッセージを返すことが可能です。

4. 例外ごとに異なるレスポンスを返す方法

「4. 例外ごとに異なるレスポンスを返す方法」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. 例外ごとに異なるレスポンスを返す方法
4. 例外ごとに異なるレスポンスを返す方法

たとえば「リソースが存在しない場合」と「入力値が間違っていた場合」とでは、返すHTTPステータスやメッセージを変えたいですよね。そのようなケースでも@ExceptionHandlerは柔軟に対応できます。


@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleNotFound(ResourceNotFoundException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body("リソースが見つかりません:" + ex.getMessage());
}

このようにすることで、HTTP 404 Not Found を返せるようになります。

5. 共通フォーマットのエラーレスポンスを作る

5. 共通フォーマットのエラーレスポンスを作る
5. 共通フォーマットのエラーレスポンスを作る

フロントエンドやAPI連携で一貫性のあるエラー形式を返すことは重要です。JSON形式のレスポンスを返すことで、エラー処理がしやすくなります。


@ExceptionHandler(Exception.class)
public ResponseEntity<Map<String, String>> handleGenericException(Exception ex) {
    Map<String, String> response = new HashMap<>();
    response.put("error", "予期しないエラーが発生しました");
    response.put("details", ex.getMessage());
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}

6. 実践!@ControllerAdvice@ExceptionHandlerの組み合わせ例

6. 実践!@ControllerAdviceと@ExceptionHandlerの組み合わせ例
6. 実践!@ControllerAdvice@ExceptionHandlerの組み合わせ例

ここまでの知識を使って、実際にグローバルな例外処理を実装してみましょう。例えば、以下のようにカスタム例外とハンドラを組み合わせます。


public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("ユーザーが見つかりません:" + ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleOther(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("内部エラー:" + ex.getMessage());
    }
}

7. REST APIと組み合わせて使うコツ

「7. REST APIと組み合わせて使うコツ」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. REST APIと組み合わせて使うコツ
7. REST APIと組み合わせて使うコツ

@RestControllerと組み合わせると、レスポンスボディに直接エラーメッセージを返すことができます。JSONでエラーデータを構造化して返すと、クライアント側の処理が楽になります。

また、ResponseEntityを活用することで、ステータスコードとメッセージの一貫性が保てます。

8. よくあるミスと注意点

8. よくあるミスと注意点
8. よくあるミスと注意点

@ControllerAdviceはSpring MVCのコンポーネントスキャンの対象に入っていないと動作しません。@ComponentScanの範囲に入れておくことを確認しましょう。

また、例外がハンドルされずにスルーされてしまう場合は、@ExceptionHandlerの引数となる例外クラスが一致しているかを再確認してください。

9. HTMLエラーページを返したい場合

9. HTMLエラーページを返したい場合
9. HTMLエラーページを返したい場合

APIではなくWeb画面でエラーを表示したい場合は、ModelAndViewを使ってHTMLテンプレートに遷移させることも可能です。


@ExceptionHandler(RuntimeException.class)
public ModelAndView handleRuntime(RuntimeException ex) {
    ModelAndView mv = new ModelAndView("error");
    mv.addObject("message", ex.getMessage());
    return mv;
}

このように書けば、エラー時にerror.htmlなどのテンプレートに遷移できます。

カテゴリの一覧へ
新着記事
New1
Java
JavaのLocalDateクラスのtoStringメソッドを完全解説!初心者でもわかる日付の文字列変換
新規投稿
New2
Spring
Javaの@PathVariableアノテーションの使い方を徹底解説!初心者でもわかるパスパラメータの基本と応用
更新記事
New3
Java
JavaのHashMapクラスentrySetメソッドの使い方を完全ガイド!初心者でもわかるjava.util入門
更新記事
New4
Java
JavaのArrayListクラスとsetメソッドを完全解説!初心者でもわかる要素の更新
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
No.3
Java&Spring記事人気No3
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.4
Java&Spring記事人気No4
Thymeleaf
Thymeleafのth:checkedの使い方!チェックボックスON/OFFを動的に制御する方法
No.5
Java&Spring記事人気No5
Spring
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.6
Java&Spring記事人気No6
Thymeleaf
Thymeleaf(タイムリーフ)の使い方入門!初心者でもわかるth:textの基礎
No.7
Java&Spring記事人気No7
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.8
Java&Spring記事人気No8
Java
Javaの抽象クラス(abstract)を完全ガイド!継承と設計のルールを学ぶ