JavaのSpringの@ExceptionHandlerアノテーションを完全ガイド!初心者でもわかる例外処理
生徒
「Springでエラーが発生したときに、どうやって適切な処理を行えばいいですか?」
先生
「Springでは、@ExceptionHandlerアノテーションを使って例外をキャッチし、適切に処理できます。」
生徒
「それって、どういう風に設定すればいいんですか?」
先生
「具体的な例を見ながら、基本の使い方を一緒に学びましょう!」
1. @ExceptionHandlerアノテーションとは?
Springの@ExceptionHandlerアノテーションは、例外が発生したときにその例外を処理するためのメソッドを定義するために使用されます。エラーが起きた場合に適切なエラーメッセージやHTTPレスポンスを返すことができます。
2. 基本的な@ExceptionHandlerの使い方
以下に、@ExceptionHandlerを使った簡単なサンプルコードを示します。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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(NullPointerException.class)
public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {
return new ResponseEntity<>("NullPointerException has occurred: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleGenericException(Exception ex) {
return "An error occurred: " + ex.getMessage();
}
}
このコードでは、2つの例外処理を定義しています。
- NullPointerException: HTTPステータス400(Bad Request)を返します。
- Exception: 一般的な例外処理としてHTTPステータス500(Internal Server Error)を返します。
将来を見据えて、+αのスキルを身につけたい方へ
JavaやLinuxを学んでいても、「このままで市場価値は上がるのか」 「キャリアの選択肢を広げたい」と感じる方は少なくありません。
AIを学ぶならアイデミープレミアム3. @ControllerAdviceを使ったグローバル例外処理
@ControllerAdviceは、複数のコントローラーで発生する例外を一括で処理するためのアノテーションです。@ExceptionHandlerと組み合わせて使うことで、コードの重複を減らし、管理しやすい設計にできます。
4. 実行結果
例外が発生した場合の出力結果は次のようになります。
NullPointerException has occurred: null
5. よくある質問と解決方法
Q: @ExceptionHandlerが動作しない場合は?
A: @ControllerAdviceクラスがSpringのコンポーネントスキャンで認識されているか確認してください。
Q: 例外ごとに異なるエラーページを表示するには?
A: ModelAndViewを返す@ExceptionHandlerメソッドを定義します。
6. まとめ
本記事では、Springフレームワークにおける例外処理の重要性と、@ExceptionHandlerアノテーションの基本的な使い方を学びました。
@ControllerAdviceと組み合わせることで、アプリケーション全体で統一的な例外処理を実現できることも理解しました。
以下に、本記事の内容を振り返りながら、実際のプロジェクトにどのように適用できるかを整理します。
@ExceptionHandlerのポイント
- 局所的な例外処理: 各コントローラークラスで特定の例外を処理する。
- グローバル例外処理:
@ControllerAdviceを利用してアプリケーション全体で一貫性のある処理を定義。 - 柔軟なレスポンス構成:
ResponseEntityやステータスコードを利用してクライアントに適切なレスポンスを返す。
具体例: 新たな例外を追加
以下は、IllegalArgumentExceptionを処理する例です。
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
return new ResponseEntity<>("Invalid argument: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
このようにして、アプリケーションの要件に応じた例外処理を柔軟に追加できます。
生徒
「今日学んだ@ExceptionHandlerを使えば、エラーが起きたときにアプリが止まるのを防げそうですね!」
先生
「その通りです。特に、@ControllerAdviceと組み合わせれば、全体的な例外処理を簡潔に管理できます。」
生徒
「他の例外も処理したいときはどうすればいいですか?」
先生
「新しい例外を追加するには、対応する@ExceptionHandlerメソッドを定義するだけで簡単に実現できます。」
生徒
「それなら、クライアントに返すエラーメッセージもカスタマイズできますね!」
先生
「そうですね。レスポンス内容やHTTPステータスコードを状況に応じて設定してください。」