Java

SpringMVCのBindingResultは順序が大事だった話

2018年5月26日

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を使うときは順番に気を付けましょう。

###############お知らせ################
ブログランキングのITカテゴリに参加してみました。
この記事が役に立ったなどお力になれたら、 このバナーを押していただけると嬉しいです。

#####################################

-Java