繁体   English   中英

Spring MVC 3.1-重定向后,RedirectAttributes不属于模型

[英]Spring MVC 3.1 - RedirectAttributes not part of model after redirect

我正在开发一个结合了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中的Model合并。 如果取消注释listAccounts中的inputFlashMap位,则将得到所需的结果。

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

方法listAccounts需要在参数中使用@ModelAttribute(“ account”)Account帐户,例如addAccount

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

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

我认为您可以通过添加实现预期的行为

@SessionAttributes("account")

而不是使用Flash范围。 但是,在这种情况下,您需要注意在需要时从会话中删除属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM