我正在寻找开发一个包含 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)没有合并到模型中?