※当サイトの記事には、広告・プロモーションが含まれます。

Spring Web MVCでリクエストに関する例外が起こり得る場所を整理してみる

www.publickey1.jp

⇧「シャーディング」によるメリットは分かったのですが、

aws.amazon.com

⇧「デメリット」もあると。

Spring Framework公式のドキュメントのSpring Web MVCのControllerとリクエストの関係についてのアーキテクチャが分かり辛い

まぁ、そもそもシーケンス図とかも用意されていないっぽいので、Spring Web MVCの処理フローがブラックボックスなんよね...

更に言うと、

docs.spring.io

⇧ 旧いバージョンのドキュメントにしか、フロー図が無いのも問題だと思うのだけど、リクエストとControllerの間に、

⇧「DispatcherServlet」なるものが存在するらしいのだけど、何故、全体的なフロー図の方で省略するのか意味が分からない...

Spring Web MVCでリクエストに関する例外が起こり得る場所を整理してみる

最新のドキュメントには、そもそもアーキテクチャ図が無いのだけど、Spring Web MVCのドキュメントの「例外」のページを確認したところ、

spring.pleiades.io

⇧ という説明になっている。

う~む、それぞれのクラスの関係性が分かり辛い...

このあたり、有識者の方がフロー図をまとめてくださっており、

qiita.com

⇧ 上図のような処理フローになっている模様。

なので、リクエストに関するエラーを受け付ける場所としては、

  1. Controllerクラスに辿り着く前後
    1. javax.servlet.ServletRequestListenerインタフェースを実装したクラスを作成して例外を捕捉する
    2. javax.servlet.Filterインタフェースを実装したクラスを作成して例外を捕捉する
    3. org.springframework.web.servlet.HandlerInterceptorインタフェースを実装したクラスを作成して例外を捕捉する
    4. @RestControllerAdvice、または、@ControllerAdviceを付与したクラスを作成して例外を捕捉する
  2. Controllerクラスのリクエストを受け付けるメソッド内部
    1. Controllerクラス内で例外を捕捉する

ということになりそう。

つまり、

  • Controllerクラスに辿り着く前に起こるようなエラー
  • Controllerクラスでリクエストを受け付けるメソッドの引数が不正で起こるようなエラー

を捕捉したい場合は、Controllerクラス以外でエラーハンドリングできるようにしておく必要がありますと。

とりあえずは、

  • @RestControllerAdvice
  • @ControllerAdvice

のどちらかを用意しておけば良いんかな?

昨今の風潮から鑑みるに、「@RestControllerAdvice」を利用する感じになるんかな。

フロントエンド側からリクエストを受けたら、データだけレスポンスとして返して、フロントエンド側はそのデータを元に表示するページを作るっていうのが多い気がしますしな。

それにしても、Spring Web MVCのドキュメントでシーケンス図とか公開して欲しいですな。

どういう実装が可能なのか分かり辛くて仕方ない...

毎度モヤモヤ感が半端ない...

今回はこのへんで。