Open5

ResponseEntityExceptionHandlerを継承して@RestControllerの例外処理をする(SpringBoot)

ふじしろふじしろ

事前準備

  1. controllerパッケージ内にMyControllerAdviceクラスを作成する
  2. ResponseEntityExceptionHandlerを継承する
  3. ResponseEntityExceptionHandlerドキュメントに記載のあるすべてのメソッドをクラス内にコピペ(全部で17メソッドあった)
    1. 現時点では詳細はわからないので全て機械的にコピペした。
  4. コピペした全てのメソッドに@Overrideを付与
  5. コピペした全てのメソッドがちゃんとメソッドとして見做されるように{}を追加
  6. コピペした全てのメソッドのjavadocに@inheritDocを付与(参考
ふじしろふじしろ

参考1

  1. レスポンスボディに設定するエラー情報用のクラスを作成する
    1. これをインスタンス化したものがエラーオブジェクト
  2. ControllerAdviceクラスを作成する
  3. 2で作成したクラスに@RestControllerアノテーションを付与する
  4. 2で作成したクラスでResponseEntityExceptionHandlerクラスを継承する
  5. handleExceptionInternalメソッドをオーバーライドする
    5. このメソッドはResponseEntityExceptionHandlerクラスで定義された全ての例外のreturn先になっている
    6. そのため、このメソッドをオーバーライドすることで、各エラー共通の処理を実装することができる
  6. 個別処理を例外に設定したい場合は、各メソッドをオーバーライドする
ふじしろふじしろ

参考2

  1. ResponseEntityExceptionHandlerクラスを継承して@RestControllerAdviceアノテーションをつけた例外ハンドリング用のクラスを作る。
  2. 例外ハンドリング用のメソッドを@ExceptionHandler(例外クラス.class)アノテーションを付与して作成する
    3. これにより該当する例外が投げられたときにそのメソッドが呼ばれるようになる。
    3. 引数で該当する例外オブジェクトを型に指定する。
  3. 例外処理全てに共通して行いたい処理(ex: ログを吐く等)を入れる場合は、handleExceptionInternalメソッドをオーバーライドする
ふじしろふじしろ

調べてみた上でどうやるか

  1. エラーレスポンス用のクラスを作成
  2. ControllerAdviceを作成(継承+アノテーション)
  3. handleExceptionInternalメソッドをオーバーライドして共通処理を実装する
  4. 各メソッドを個別にオーバーライドしてそれぞれが独自で必要な処理を実装する
  5. なお、handleExceptionメソッドはfinalで定義されているためオーバーライドはできない。
ふじしろふじしろ

参考3

Spring Boot 例外処理/エラーハンドリングメモ - Gobble up pudding

  • 途中に出てくるスライドが参考になった。
  • Spring Bootにおけるいろんな例外処理のやり方を列挙した上で、ErrorControllerによるエラーハンドリングを推奨している
  • 一番参考になったのは、SpringMVCにおける例外発生時に呼び出されるResolverの順番
    1. ExceptionHandlerExceptionResolver(@ExceptionHandlerを処理するもの)
    2. ResponseStatusExceptionResolver(@ResponseStatusを処理するもの)
    3. DefaultHandlerExceptionResolver(SptingMVC内で発生した例外を処理する)
    4. ErrorController