POST/Redirect/GET パターンと入力検証を組み込んだ Spring MVC アプリケーションの開発を検討しています。POST フェーズでは、Validator を実行して BindingResult/Errors コレクションを取得します。エラーがある場合は、検証エラーをそのままにしてフォームにリダイレクトしたいと思います。ブラウザーのナビゲーション ボタン (戻る、進む、更新) を使用するときに期限切れのキャッシュとフォームの再送信プロンプトを回避するために、これを GET 要求として解決するリダイレクトにしたいと考えています。
これは、最初のフォーム表示を処理する方法であり、検証エラーが発生した場合にユーザーをリダイレクトしたい場所です。
@RequestMapping("/account/list")
public String listAccounts(HttpServletRequest request, Map<String, Object> map) {
log.debug("start of list accounts");
map.put("accountList", entityService.listAccounts());
map.put("account", new Account());
map.put("accountTypeValues", AccountTypes.values());
// Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
// if (inputFlashMap != null) {
// map.putAll(inputFlashMap);
// }
return "account";
}
これは、POST を処理するメソッドのスニペットです。
@RequestMapping(value = "/account/add", method = RequestMethod.POST)
public String addAccount(@ModelAttribute("account") @Valid Account account, BindingResult result, RedirectAttributes redirectAttributes, HttpServletRequest request, Map<String, Object> model) {
accountValidator.validate(account, result);
if (result.hasErrors()) {
redirectAttributes.addFlashAttribute("account", account);
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + "account", result);
return "redirect:/account/list";
}
addAccount メソッドの最後と、listAccounts メソッドでのリダイレクトの後に、HttpServletRequest オブジェクトで FlashMap を確認できます。ただし、そのマップが listAccounts のモデルとマージされることはありません。listAccounts の inputFlashMap ビットのコメントを外すと、目的の結果が得られます。
リダイレクト後に RedirectAttributes (別名 FlashMap) がモデルにマージされないのはなぜですか?