はじめに
はじめまして、NekoSarada1101です。
Qiita初投稿です。
専門学校でJavaやサーブレットなどの勉強をしています。
現在、独学でSpringフレームワークの勉強をしているのですが、その中で解決に時間がかかってしまったエラーについての記事を投稿しようと思います。
本題
Springの勉強のために開発しているWebアプリのログイン画面の入力に対してバリデーションを行うために以下のようなコントローラーを定義しました。
@PostMapping("/auth")
public String postLogin(@ModelAttribute @Validated LoginForm form, Model model, BindingResult result) {
if (result.hasErrors()) {
return "login";
}
User user = userService.login(form.getId(), form.getPassword());
model.addAttribute("user", user);
return "redirect:/menu";
}
入力に問題が無ければ次の画面へ、あればログイン画面へ戻ります。
このコントローラーに対してリクエストを送信すると...
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Tue Apr 28 14:36:33 JST 2020
There was an unexpected error (type=Bad Request, status=400).
上記のエラーが画面に表示されました。
原因と解決策
原因はコントローラーの引数の順番でした。
BindingResultはバリデーリョン対象のFormオブジェクトの直後に定義しなければならないようです。
@PostMapping("/auth")
public String postLogin(@ModelAttribute @Validated LoginForm form, BindingResult result, Model model) {
if (result.hasErrors()) {
return "login";
}
User user = userService.login(form.getId(), form.getPassword());
model.addAttribute("user", user);
return "redirect:/menu";
}
このようにhoge(Form, BindingResult, Model)
の順番にしなければいけません。
終わりに
コンソールにエラーログもでず、引数の順番が原因のエラーが発生したのは初めて。何が問題なのかさっぱり分からず、かなり解決までに時間がかかってしまいました。
それと、冒頭にも書いた通り初投稿でこういったアウトプットにも慣れていないので、何か間違っているところやアドバイスなどがありましたら、優しく教えていただけたら嬉しいです。