SpringMVCで、画面入力をサーバで操作するために@ModelaAttributeを使って、@Validでバリデーションを行いました。
そして、後になってからその結果をBindingResult#hasErrorで受け取る必要が出たのでメソッドに追加して、以下の様なメソッドになりました。
public String acceptInquiry(@ModelAttribute @Valid UserInquiryForm c06_userInquiryNewForm, Model model,BindingResult bindingResult)
引数の順番が、Form/Model/BindingResultとなっています。
後から追加したBindingResultが最後に追加されています。
このメソッドに対してリクエストを送信すると
HTTPステータス 400 - Bad Request
Type ステータスレポート説明 The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
Apache Tomcat/8.5.13
が画面から返ってきました。
なぜなのか。
調べていくと同じような話が質問されていました。
https://stackoverflow.com/questions/29432717/spring-mvc-validation-status-400
どうやら、BindingReult型の変数を使うときは、その順番が大切になるようで、Form/BindingResult/Modelというように、BindingReultがFormの直後に来ないといけないようです。
エラーログも特に出ないうえに、基本的にそんな説明はどこにもされていないので、引っかかる人が多いのではないでしょうか。
Springを使っていて、BindingResultを使うときは順番に気を付けましょう。