Open5
ResponseEntityExceptionHandlerを継承して@RestControllerの例外処理をする(SpringBoot)
参考1
-
【Spring Boot】エラーハンドリング(REST API)
この記事ではハンズオン的にエラーレスポンスのカスタマイズ方法が紹介されている
- レスポンスボディに設定するエラー情報用のクラスを作成する
- これをインスタンス化したものがエラーオブジェクト
- ControllerAdviceクラスを作成する
- 2で作成したクラスに
@RestController
アノテーションを付与する - 2で作成したクラスで
ResponseEntityExceptionHandler
クラスを継承する -
handleExceptionInternal
メソッドをオーバーライドする
5. このメソッドはResponseEntityExceptionHandler
クラスで定義された全ての例外のreturn先になっている
6. そのため、このメソッドをオーバーライドすることで、各エラー共通の処理を実装することができる - 個別処理を例外に設定したい場合は、各メソッドをオーバーライドする
参考2
- ResponseEntityExceptionHandlerクラスを継承して@RestControllerAdviceアノテーションをつけた例外ハンドリング用のクラスを作る。
- 例外ハンドリング用のメソッドを
@ExceptionHandler(例外クラス.class)
アノテーションを付与して作成する
3. これにより該当する例外が投げられたときにそのメソッドが呼ばれるようになる。
3. 引数で該当する例外オブジェクトを型に指定する。 - 例外処理全てに共通して行いたい処理(ex: ログを吐く等)を入れる場合は、handleExceptionInternalメソッドをオーバーライドする
調べてみた上でどうやるか
- エラーレスポンス用のクラスを作成
-
ControllerAdvice
を作成(継承+アノテーション) -
handleExceptionInternal
メソッドをオーバーライドして共通処理を実装する - 各メソッドを個別にオーバーライドしてそれぞれが独自で必要な処理を実装する
- なお、handleExceptionメソッドは
final
で定義されているためオーバーライドはできない。
参考3
Spring Boot 例外処理/エラーハンドリングメモ - Gobble up pudding
- 途中に出てくるスライドが参考になった。
- Spring Bootにおけるいろんな例外処理のやり方を列挙した上で、ErrorControllerによるエラーハンドリングを推奨している
- 一番参考になったのは、SpringMVCにおける例外発生時に呼び出されるResolverの順番
- ExceptionHandlerExceptionResolver(
@ExceptionHandler
を処理するもの) - ResponseStatusExceptionResolver(
@ResponseStatus
を処理するもの) - DefaultHandlerExceptionResolver(SptingMVC内で発生した例外を処理する)
- ErrorController
- ExceptionHandlerExceptionResolver(