Closed fujithuro closed 2 weeks ago
エラーレスポンスに関する標準がRFC 9457
でまとめられている。
(以前はRFC 7807
だったが、廃止されている)
RFC 9457 - Problem Details for HTTP APIs 日本語訳 https://tex2e.github.io/rfc-translater/html/rfc9457.html
これにガッツリ準拠する必要まではないのかもしれないが、ちゃんと参考にはしたい
まだNotNullくらいしか使っていないが、Spring Bootではアノテーションを使った入力値検証ができるし、違反した場合のエラーメッセージも設定できる。これらを活用してエラーの概要を返すようにするのがいいのではないか。
つまり@field:NotNull(message = "Date is required.")
などを活用することで、簡単にレスポンス作成ができるのではと考えていた。
しかし、おそらくそういうわけにもいかなさそう?
例外ハンドラーに例外発生時の処理を集約する場合、message
に設定した内容は、例外から取得してレスポンスに設定し直す手間が必要。
message
を書いてさえおけば後は良い感じにしてくれる、というようなものではない。
エラーの詳細は、例外が保持している情報から取得できる。
たとえばMethodArgumentNotValidException
であればBindingResult
から取得でき、
MethodArgumentTypeMismatchException
はname
から発生元のフィールド、value
から実際渡された値を取得できる。
これらの情報を参照し、要件に合ったロギングやレスポンスの作成を行うのが適切と思われる。
別ブランチを作らず、コミットメッセージにも参照を書かないまま、このIssueへの対応を進めてしまった。 PRも何もないが、対応完了している
現状と課題
入力値検証で例外が発生し、
400 Bad Request
を返す場合、そのmessage
をINFO
レベルで記録しているが、 レスポンスボディは空にしている。 受け取った側が分かりやすいように、エラーの概要をメッセージボディで返したい。なお、単純に例外の
message
を返すだけだと、MethodArgumentNotValidException
とHttpMessageNotReadableException
の場合で内部構造の情報をガッツリ含んだメッセージになってしまう。これはユーザーには見せたくない。例
せめてどのプロパティに問題があったのかだけでも分かるようにしたい。
対応方針
まだ
NotNull
くらいしか使っていないが、Spring Bootではアノテーションを使った入力値検証ができるし、違反した場合のエラーメッセージも設定できる。これらを活用してエラーの概要を返すようにするのがいいのではないか。