ユーザーからの入力値を受け取った後、入力値チェックに引っかかった場合は、エラー内容とともにリダイレクトを行いたい。
※ 今回ユーザーからの入力値を受け取るクラスをUserFormとする。
リダイレクト先
@RequestMapping("/afterRedirect")
public String afterRedirect() {
return "afterRedirect";
}
リダイレクト元
@RequestMapping("/beforeRedirect")
public String beforeRedirect(
@Validated UserForm userForm, // 今回ユーザーからの入力値を受け取るクラスをUserFormとして作成
BindingResult result,
RedirectAttributes redirectAttributes,
) {
// 入力値チェックして、エラーがあればリダイレクトする
if(result.hasErrors()) {
redirectAttributes.addFlashAttribute(userForm); // (1)
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + Conventions.getVariableName(userForm), result); // (2)
return "redirect:/afterRedirect";
}
return "noRedirect";
}
解説
Number | 内容 |
---|---|
(1) | ユーザーが入力した値をリダイレクト先でも維持していたいので、フラッシュスコープにuserFormを詰める。 |
(2) | ここでBindingResultのエラー内容をフラッシュスコープに詰めている。 BindingResultがページに渡される際には、オブジェクト名の前に org.springframework.validation.BindingResult. という接頭辞がつくらしい。この接頭辞は、BindingResult#MODEL_KEY_PREFIX で表現することができる。今回、UserFormクラスのエラーをリダイレクト先に渡したいので、 Conventionsクラス のgetVariableNameメソッドを用いて変数名を指定する。よって、フラッシュスコープには、スコープ名 BindingResult.MODEL_KEY_PREFIX + Conventions.getVariableName(userForm) ,スコープの中身は resul となる |
参考文献
【悲報】Spring Bootのバリデーションで壁にぶち当たる
org.springframework.core.Conventions
SpringMVC BindingResultのRedirect