カテゴリ: Spring 更新日: 2026/07/12

Javaの@ControllerAdviceアノテーションを完全ガイド!初心者でもわかるエラーハンドリングの基本

Springの@ControllerAdviceアノテーション
Springの@ControllerAdviceアノテーション

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

生徒

「Javaで、アプリケーション全体の例外を一元管理する方法ってありますか?」

先生

「それについては、@ControllerAdviceアノテーションを使うと良いですよ。これを使うことで、コントローラーのエラーハンドリングを中央集中的に管理できます。」

生徒

「なるほど!具体的にはどうやって使うんですか?」

先生

「それでは、@ControllerAdviceアノテーションの使い方とその活用法について詳しく見ていきましょう!」

1. @ControllerAdviceアノテーションとは?

1. @ControllerAdviceアノテーションとは?
1. @ControllerAdviceアノテーションとは?

@ControllerAdviceは、Spring Frameworkの一部で、コントローラー層全体に対して例外処理を集中管理できるようにするアノテーションです。このアノテーションを使うことで、個別のコントローラーでエラーハンドリングを行うのではなく、アプリケーション全体で一貫したエラーハンドリングができるようになります。
主に、例外を捕捉してエラーメッセージをカスタマイズしたり、特定のエラーコードを返したりする際に利用します。

2. @ControllerAdviceアノテーションの基本的な使い方

2. @ControllerAdviceアノテーションの基本的な使い方
2. @ControllerAdviceアノテーションの基本的な使い方

@ControllerAdviceは、通常、専用のクラスに付与されます。このクラスでは、@ExceptionHandlerアノテーションを使って、発生する可能性のある例外をキャッチし、適切な処理を行います。以下に、@ControllerAdviceを使った基本的な例を示します。


import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleException(Exception e, Model model) {
        model.addAttribute("errorMessage", e.getMessage());
        return "errorPage";  // エラーページにリダイレクト
    }
}

上記のコードでは、@ControllerAdviceを使ってグローバルな例外処理を実現しています。@ExceptionHandler(Exception.class)により、アプリケーション全体で発生するExceptionをキャッチし、handleExceptionメソッドでエラーメッセージをモデルに追加して、専用のエラーページを表示する仕組みです。

3. エラーハンドリングをもっと柔軟に

3. エラーハンドリングをもっと柔軟に
3. エラーハンドリングをもっと柔軟に

@ControllerAdviceでは、エラーハンドリングをさらに柔軟に設定できます。例えば、複数の異なる例外に対して異なるエラーメッセージを表示することも可能です。以下にその例を示します。


import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class AdvancedExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleNullPointerException(NullPointerException e) {
        return "Null Pointer Error: " + e.getMessage();
    }

    @ExceptionHandler(ArithmeticException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleArithmeticException(ArithmeticException e) {
        return "Arithmetic Error: " + e.getMessage();
    }
}

こちらのコードでは、NullPointerExceptionとArithmeticExceptionを個別に処理しています。異なるエラーメッセージを返すことで、ユーザーにとってわかりやすいエラー情報を提供することができます。

4. @ControllerAdviceを使った入力検証エラーの処理

4. @ControllerAdviceを使った入力検証エラーの処理
4. @ControllerAdviceを使った入力検証エラーの処理

@ControllerAdviceは、バリデーションエラーにも活用できます。たとえば、フォームの入力値に対するエラーメッセージを集中管理することが可能です。以下のコードは、@Validアノテーションを使って入力値の検証を行い、エラーが発生した場合にそのエラーメッセージを表示する例です。


import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class ValidationErrorHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleValidationException(MethodArgumentNotValidException e, Model model) {
        BindingResult result = e.getBindingResult();
        model.addAttribute("errorMessage", result.getAllErrors());
        return "validationErrorPage";  // 入力エラー専用ページ
    }
}

このコードでは、MethodArgumentNotValidExceptionというバリデーションエラーをキャッチし、エラーの詳細をモデルに追加して専用のエラーページにリダイレクトしています。このように、@ControllerAdviceを使うことで、入力エラーを効率的に処理できます。

5. @ControllerAdviceのポイントと注意点

5. @ControllerAdviceのポイントと注意点
5. @ControllerAdviceのポイントと注意点

@ControllerAdviceを使うことで、アプリケーション全体で統一的なエラーハンドリングができますが、以下の点に注意する必要があります。
1. すべての例外を一元管理すると、アプリケーションがどの例外でエラーを発生させているのかを見つけにくくなることがあります。エラーハンドリングは適切に分けて管理しましょう。
2. 例外を適切に捕捉し、エラーメッセージをカスタマイズしてユーザーにわかりやすい情報を提供することが大切です。

6. まとめ

6. まとめ
6. まとめ

この記事では、JavaのSpring Frameworkにおける@ControllerAdviceアノテーションについて詳しく解説しました。@ControllerAdviceを使うことで、アプリケーション全体で一貫したエラーハンドリングが可能になります。これにより、個々のコントローラーで例外を処理する手間を省き、エラーハンドリングを中央集中的に管理できるようになります。
具体的には、@ExceptionHandlerを使って例外をキャッチし、適切なエラーメッセージやレスポンスを返すことができます。また、@ControllerAdviceを使うことで、入力値の検証エラーや、特定のエラーに対して柔軟に対応することも可能です。これにより、ユーザーにとって分かりやすいエラーメッセージを提供することができます。
さらに、エラーハンドリングを集中管理することによって、メンテナンス性も向上し、コードの重複を避けることができます。ただし、注意点として、全ての例外を一元管理する場合、エラーの発生箇所を特定するのが難しくなることもあるため、適切に管理することが重要です。
@ControllerAdviceをうまく活用することで、エラーハンドリングが簡素化され、エラー処理を効果的に行うことができます。

先生と生徒の振り返り会話

生徒

「先生、@ControllerAdviceアノテーションについてよくわかりました。エラーハンドリングをアプリケーション全体で集中管理することで、コードの重複がなくなるし、メンテナンスも楽になりますね。」

先生

「その通りです!@ControllerAdviceを使うと、エラー処理を一元化できるので、コードがスッキリして、エラーが発生した際にもユーザーにわかりやすいメッセージを返せるようになりますよ。」

生徒

「それに、エラーメッセージをカスタマイズできるのもいいですね。例えば、NullPointerExceptionやArithmeticExceptionを個別に処理できるので、ユーザーに具体的なエラー内容を伝えられます。」

先生

「はい、その通りです!それぞれのエラーに対して適切なメッセージを表示することで、ユーザーが問題を理解しやすくなります。@ControllerAdviceは、エラーハンドリングを効率的に行うための強力なツールです。」

生徒

「ありがとうございます、@ControllerAdviceを使ってエラーハンドリングを統一すれば、より良いアプリケーションが作れそうです。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaのSpring Frameworkで@ControllerAdviceとは何ですか?

@ControllerAdviceは、Spring Frameworkでエラーハンドリングをアプリケーション全体に適用できるアノテーションです。個別のコントローラーに書かなくても、共通の例外処理を一か所でまとめて管理できます。

@ControllerAdviceアノテーションはいつ使うのが効果的ですか?

複数のコントローラーで共通の例外処理を行いたいときに使うと効果的です。例えば、アプリ全体で発生するエラーを一括で処理したい場合や、ユーザーに統一したエラーメッセージを返したい場合に最適です。

@ExceptionHandlerと@ControllerAdviceの違いは何ですか?

@ExceptionHandlerは個々のコントローラー内で使う例外処理です。一方、@ControllerAdviceは全体のコントローラーに共通して例外を処理するために使います。
生成AIを基礎から学びたい方へ

ChatGPTなどの生成AIをこれから学びたい方に向けて、AIスキルアカデミーの口コミ・評判、料金、無料セミナーの内容を詳しくまとめています。

AIスキルアカデミーの口コミ・評判を詳しく見る
カテゴリの一覧へ
新着記事
New1
Java
JavaのassertFalseとは?JUnit5のAssertionsクラスを初心者向けにわかりやすく解説
新規投稿
New2
Thymeleaf
ThymeleafでDBから取得したデータを編集フォームの初期値にセットする方法!Entity連携を初心者向けに解説
新規投稿
New3
Spring
JavaのSpringで使う@FutureOrPresentアノテーションを完全ガイド!初心者でもわかる日付バリデーション
新規投稿
New4
Java
JavaのLocalDateクラスのgetMonthValueメソッド完全ガイド!初心者でもわかる数値で月を取得する方法
新規投稿
人気記事
No.1
Java&Spring記事人気No1
Servlet
JavaサーブレットのdoPostメソッドとは?初心者向けにやさしく解説!
No.2
Java&Spring記事人気No2
Servlet
JavaのHttpServletResponseクラスを初心者向けに徹底解説!
No.3
Java&Spring記事人気No3
Servlet
JavaのHttpServletRequestWrapperとgetSessionメソッドの使い方を徹底解説!初心者向けServletのセッション管理入門
No.4
Java&Spring記事人気No4
Servlet
JavaのServletExceptionクラスを初心者向けに徹底解説!
No.5
Java&Spring記事人気No5
Servlet
JavaのHttpSessionインターフェースとgetSessionContextメソッドを徹底解説!初心者でもわかるセッション管理の基本
No.6
Java&Spring記事人気No6
Java
JavaのStringクラスとlengthメソッドを完全解説!初心者でも理解できる文字列の長さ取得の使い方
No.7
Java&Spring記事人気No7
Servlet
JavaのHttpSessionAttributeListenerとattributeRemovedメソッドの使い方を徹底解説!初心者でもわかるセッション属性の削除と監視
No.8
Java&Spring記事人気No8
Java
Javaのクラスとインスタンス化、コンストラクタの使い方完全ガイド!初心者でもわかるオブジェクト指向の基礎