Spring MVC 3.1 - 重定向后RedirectAttributes不是模型的一部分

时间:2013-01-12 23:26:20

标签: java spring spring-mvc

我正在寻找开发一个包含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方法末尾的HttpServletRequest对象中看到FlashMap,并在listAccounts方法中重定向后再次看到。但是,该映射永远不会与listAccounts中的Model合并。如果我取消注释listAccounts中的inputFlashMap位,那么我会得到所需的结果。

为什么RedirectAttributes(又名FlashMap)在重定向后没有合并到模型中?

3 个答案:

答案 0 :(得分:1)

方法listAccounts需要@ModelAttribute(&#34; account&#34;)params中的帐户帐户,例如addAccount

答案 1 :(得分:0)

您无需担心缓存POST请求。因为POST请求根本不应该被追逐。

因此,返回输入表单以响应无效的POST请求是有效的。

答案 2 :(得分:0)

我认为你可以通过添加

来达到理想的行为
@SessionAttributes("account")

到您的控制器而不是使用闪存范围。但是,在这种情况下,您需要注意在需要时从会话中删除属性。