[英]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.