ユーザーからの入力値を受け取った後、入力値チェックに引っかかった場合は、エラー内容とともにリダイレクトを行いたい。
※ 今回ユーザーからの入力値を受け取るクラスを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