今回は、BindingResultをリダイレクトする方法についてメモしていきたいと思います。
Controller構成
/**
* 編集画面を返却する。
* @param id お知らせID
* @param model
* @param redirectAttributes
* @return 編集画面
*/
@GetMapping("/edit/{id}")
public String editIndex(
@PathVariable Integer id,
Model model,
RedirectAttributes redirectAttributes) {
model.addAttribute("informationTypes", InformationType.values());
try {
PostRequestForm postResponseForm = editService.findById(id);
model.addAttribute("postRequestForm", postResponseForm);
} catch (IllegalArgumentException ex) {
log.warn(ex.getMessage());
redirectAttributes.addAttribute(
MessageType.ERROR_MESSAGE.name(), messageSource.getMessage("VE00008", null, null));
return REDIRECT_SEARCH;
}
return ViewNames.EDIT_PAGE;
}
- Getのメソッドです。
/**
* 編集確認画面を返却する。
* @param id お知らせID
* @param postRequestForm お知らせリクエストフォーム
* @param bindingResult
* @param model
* @param redirectAttributes
* @return 編集確認画面
*/
@PostMapping("/edit/{id}/confirm")
public String editConfirmIndex(
@PathVariable Integer id,
@ModelAttribute @Validated PostRequestForm postRequestForm,
BindingResult bindingResult,
Model model,
RedirectAttributes redirectAttributes) {
model.addAttribute("informationTypes", InformationType.values());
if (bindingResult.hasErrors()) {
redirectAttributes.addFlashAttribute(
MessageType.ERROR_MESSAGE.name(), messageSource.getMessage("VE00000", null, null));
redirectAttributes.addFlashAttribute(postRequestForm);
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + Conventions.getVariableName(postRequestForm), bindingResult);
return REDIRECT_EDIT + id;
}
return ViewNames.EDIT_CONFIRM_PAGE;
}
- Postのメソッドです。
BindingResultのRedirect方法
上記のPostのソースコードにも書いてありますが、
if (bindingResult.hasErrors()) {
redirectAttributes.addFlashAttribute(
MessageType.ERROR_MESSAGE.name(), messageSource.getMessage("VE00000", null, null));
redirectAttributes.addFlashAttribute(postRequestForm);
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + Conventions.getVariableName(postRequestForm), bindingResult);
return REDIRECT_EDIT + id;
}
- redirectAttributes.addFlashAttribute(postRequestForm):リダイレクト先でPostRequestFormインスタンスとBindingResultインスタンスを参照できるように格納する。
- redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + Conventions.getVariableName(postRequestForm), bindingResult): PostRequestFormテンプレート内で#fieldsやth:errorsでバリデーションエラーを参照するには、org.springframework.validation.BindingResult.{クラス名 (Camel Case)}というキー名で設定する必要がある。
これでエラーメッセージもリダイレクトできるようになったはずです。
終わりに
業務でどうしようと詰まっていましたが、上記のように修正したら正常に動きましたので、自分のサイドプロジェクトにも適用してみました。(上記のソースコードは業務のソースコードではなく個人のプロジェクトの一部です。)
