SpringMVC BindingResultのRedirect

今回は、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)}というキー名で設定する必要がある。

これでエラーメッセージもリダイレクトできるようになったはずです。

終わりに

業務でどうしようと詰まっていましたが、上記のように修正したら正常に動きましたので、自分のサイドプロジェクトにも適用してみました。(上記のソースコードは業務のソースコードではなく個人のプロジェクトの一部です。)

参考

https://qiita.com/unhurried/items/de32dfe5c87643491e54

コメントを残す