カテゴリ: Spring 更新日: 2025/12/02

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

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

教材紹介 Spring Boot 学習のおすすめ教材

Spring Bootを使ったWebアプリケーション開発を、 環境構築から実践まで一通り学びたい方には、 定評のある入門書が参考になります。

Spring Boot 3 プログラミング入門をAmazonで見る

※ Amazon広告リンク

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

生徒

「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();
    }
}

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

Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。

Spring Framework超入門をAmazonで見る

※ Amazon広告リンク

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を使うと、エラー処理を一元化できるので、コードがスッキリして、エラーが発生した際にもユーザーにわかりやすいメッセージを返せるようになりますよ。」

生徒

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

先生

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

生徒

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

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

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

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

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

@ControllerAdviceは、Spring Frameworkでエラーハンドリングをアプリケーション全体に適用できるアノテーションです。個別のコントローラーに書かなくても、共通の例外処理を一か所でまとめて管理できます。
カテゴリの一覧へ
新着記事
JavaのIndexOutOfBoundsExceptionを完全ガイド!初心者でも理解できる例外処理と回避方法
スッキリわかるJava入門 第4版|独学でもレッスンでも学べる完全ガイド
JavaのCookieクラスのgetCommentメソッドを解説!Servlet開発でクッキーの説明文を取得する方法
JavaのBufferedOutputStreamクラスのwriteメソッドを徹底解説!初心者でもわかるファイルへのバイナリ書き込み
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.3
Java&Spring記事人気No3
Spring Data JPA入門!findAll()やfindBy**()の使い方などデータベース操作の基礎を学ぶ
No.4
Java&Spring記事人気No4
Thymeleafのth:classappend属性の使い方を完全ガイド!初心者でもわかる動的クラス追加
No.5
Java&Spring記事人気No5
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.6
Java&Spring記事人気No6
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.7
Java&Spring記事人気No7
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス
No.8
Java&Spring記事人気No8
JavaのArrayListクラスとgetメソッドを完全解説!初心者でもわかるリストの要素取得

💻 作業効率アップに

長時間のコーディングでも疲れにくい♪ 静音ワイヤレスマウス

Logicool Signature M750 を見る

※ Amazon広告リンク