システムエンジニアライフ

都内在住のオープンWEB系システムエンジニアのエンジニアライフのブログです。

Spring Bootでバリデーションでunexpected errorになった原因について

仕事で単純な業務アプリケーションを開発してたのですが、バリデーションエラー発生した時にWhitelabel Error Pageになってしまい、ログにも何も出力されずハマった事象になります。

状況

@PostMapping("/input")
String confirm(Model model, @Validated @ModelAttribute CompanySalesCodeEdit companySalesCodeEdit,
@PathVariable CompanyCode companyCode,
BindingResult bindingResult
) {

 何も考えずに引数を好きなように並べていました。

そうすると、下記のようなエラーが発生しました。

f:id:taksakam:20210121225305p:plain

エラー画面

Bad Request, status=400と出るし、Validation failed for objectなる見慣れるエラーが画面には出るが、ログには特にエラー出力はなく、どハマりしました。

 

解決方法

引数の順番を変えました。

@ModelAttributeの引数の隣にBindingResultを持ってくること。

@PostMapping("/input")
String confirm(Model model, @Validated @ModelAttribute CompanySalesCodeEdit companySalesCodeEdit,
         BindingResult bindingResult,
@PathVariable CompanyCode companyCode
) {

 

Springのドキュメントにも下記記載がありました。

Example 17.1. Invalid ordering of BindingResult and @ModelAttribute

@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet,
    Model model, BindingResult result) { … }

Note, that there is a Model parameter in between Pet and BindingResult. To get this working you have to reorder the parameters as follows:

@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet,
    BindingResult result, Model model) { … }

 

フレームワークの仕様とはいえ、詳細なログが出ないとなかなか原因が見つけづらいですよね。フレームワークのドキュメントって英語が多いので全部読んで実装している人って少ないんだろうな。