LoginSignup
0
1

More than 3 years have passed since last update.

SpringのバリデーションはFormとBindingResultの順番が大事だった件

Last updated at Posted at 2020-04-28

はじめに

はじめまして、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)の順番にしなければいけません。

終わりに

コンソールにエラーログもでず、引数の順番が原因のエラーが発生したのは初めて。何が問題なのかさっぱり分からず、かなり解決までに時間がかかってしまいました。

それと、冒頭にも書いた通り初投稿でこういったアウトプットにも慣れていないので、何か間違っているところやアドバイスなどがありましたら、優しく教えていただけたら嬉しいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1