1

我正在寻找开发一个包含 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 中的模型合并。如果我取消注释 listAccounts 中的 inputFlashMap 位,那么我会得到所需的结果。

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

4

3 回答 3

1

方法 listAccounts 需要 @ModelAttribute("account") Account account 像 addAccount 这样的参数

于 2014-04-10T08:14:09.383 回答
0

You do not need to worry about caching POST requests. Because POST requests should not been chached at all.

So it it valid to return the input form in response of an invalid POST request.

于 2013-01-13T10:30:22.637 回答
0

我认为您可以通过添加来实现所需的行为

@SessionAttributes("account")

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

于 2013-01-15T23:01:23.153 回答