Open3

RestfulAPIにおけるBindingException生成までの流れ(Spring)

ふじしろふじしろ

※あくまで処理フローの全体像をイメージするためのもの

基本の流れ

(クライアント)HttpRequest->(サーバー)SpringBoot->Controller

Formを経由する流れ

(クライアント)HttpRequest->(サーバー)SpringBoot->Form->Controller

Formを経由し、バリデーションが行われる場合(バリデーションエラーなし)

(クライアント)HttpRequest->(サーバー)SpringBoot->Form->(Validate処理)->Controller

Formを経由し、バリデーションが行われる場合(バリデーションエラーあり)

(クライアント)HttpRequest->(サーバー)SpringBoot->Form->(Validate処理)->Controller->BindingException例外
※バリデーションエラー発生時は、BindingException例外(BindingException または MethodArgumentNotValidException)が投げられる。

Formを経由し、バリデーションが行われ、ControllerAdviceがある場合(バリデーションエラーあり)

(クライアント)HttpRequest->(サーバー)SpringBoot->Form->(Validate処理)->Controller->BindingException例外->ControllerAdvice
※ControllerAdviceがある場合は、そこで補足することが可能。

Formを経由し、バリデーションが行われ、引数にBindingResultを設定している場合

(クライアント)HttpRequest->(サーバー)SpringBoot->Form->(Validate処理)->(BindingResult生成)->Controller
※バリデーションエラー発生時も例外は発生せず、結果がBindingResultへと格納される

ふじしろふじしろ

なお、バリデーションにより発生しうる例外であるBindExceptionとMethodArgumentNotValidExceptionでは、BindExceptionの方が上位。
なので、ControllerAdviceで補足を確認するときは、MethodArgumentNotValidExceptionから試した方が良さげ

BindException:基底クラス(親)
MethodArgumentNotValidException:派生クラス(子)