事象としては以下のシナリオです。
- ユーザー登録画面への入力値がValidationエラーになり登録画面に戻る。エラーとなる項目はage(age=200は範囲外)。
- 登録画面へ遷移するためのコントローラメソッドでは、Formの初期値設定を行っている(age=25)。
- 再び登録画面を表示するが、年齢欄には設定し直した25ではなく200が表示されている(ここが疑問点)。
項番2で再び初期値(25)を設定しているので、その後に表示する画面では初期値(25)が表示されるかと思いきや、遷移元の画面入力値(200)が保持されていて表示されました。この理由が分からず混乱しています。
キャッシュが残っている系の原因を想像しましたが解決できず、ご教授頂きたいです。
よろしくお願い致します。
※2022/05/19追記
色々と試してみた内容を追記します。要点は2点あります。
- エラーではない項目は、コントローラで値を再設定することで画面にも再設定後の値が表示された。
- デバッガを使用して、
model
のbindingResult
に含まれるrejectedValue
の値を書き換えたら、画面にも書き換え後の値が反映された。
このことから、エラーを起こした項目についてはmodel.form
の値ではなくmodel.bindingResult
の値を使ってHTMLをレンダリングするらしいことが分かりました。もしも、この辺りの情報が公式ドキュメントなどに書いてあるなど、関連情報をお持ちの方がいらっしゃったら、引き続き教えて頂きたいと思っています。追加情報が無さそうであれば、様子を見て自己解決にしようと思います。
以下に関連するコードを抜粋します。
- コントローラメソッド
SignupController.java
1@GetMapping("/signup") 2public String getSignup(Model model, Locale locale, @ModelAttribute SignupForm form) { 3 : 4 form.setAge(25); 5 : 6 return "user/signup"; 7} 8 9@PostMapping("/signup") 10public String postSignup(Model model, Locale locale, 11 @ModelAttribute @Validated SignupForm form, BindingResult bindingResult) { 12 13 if (bindingResult.hasErrors()) { 14 return getSignup(model, locale, form); 15 } 16 : 17}
- Form
SignupForm.java
1@Min(20) 2@Max(100) 3private Integer age;
- 画面
signup.html
1<div class="form-group"> 2 <label for="age" th:text="#{age}"></label> 3 <input type="text" class="form-control" th:field="*{age}" th:errorclass="is-invalid"/> 4 <div class="invalid-feedback" th:errors="*{age}"></div> 5</div>
回答1件
あなたの回答
tips
プレビュー