另一个控制器方法中的Spring预处理请求
-
11-12-2019 - |
题
在我的一个控制器中,我有:
@RequestMapping(value = "search", method = RequestMethod.GET)
public ModelAndView searchUsers(HttpSession session, HttpServletRequest request) {
UiUserSearchCriteria userSearchCriteria = (UiUserSearchCriteria) session
.getAttribute("UsersController_userSearchCriteria");
if (null == userSearchCriteria) {
userSearchCriteria= defaultUserSearchCriteria;
}
// Here be dragons
return searchUsers(userSearchCriteria, new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria"), session, request);
}
@RequestMapping(value = "search", method = RequestMethod.POST)
public ModelAndView searchUsers(
@ModelAttribute("userSearchCriteria") UiUserSearchCriteria userSearchCriteria,
BindingResult bindingResult, HttpSession session, HttpServletRequest request) {
userSearchCriteriaValidator.validate(userSearchCriteria, bindingResult);
if (bindingResult.hasErrors()) {
// Here be dragons
return new ModelAndView("searchUsers");
}
ModelAndView result = new ModelAndView("redirect:listUsers");
PagedListHolder<UiUser> userList = new PagedListHolder<UiUser>(
usersService.searchUsers(userSearchCriteria));
userList.setPageSize(10);
userList.setSort(defaultSort);
userList.resort();
session.setAttribute("UsersController_userList", userList);
session.setAttribute("UsersController_userSearchCriteria", userSearchCriteria);
return result;
}
逻辑很简单:当用户导航到搜索页面时,我实际上使用默认条件执行搜索并向他返回一个列表(这是需求变化的结果,呵呵)。
我在这段代码中发现了一个问题,不小心。当默认搜索条件无效时,行为是:导航到搜索->使用无效条件填充搜索条件->调用另一个方法(第二个方法,带有POST)->执行验证-> errors
不是空的,所以返回 searchUsers
视图。但是 BindingResult bindingResult
实际上是syntethic,从以前的方法(new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).所以我得到了一个错误 No binding result is bound to session
(我同意这一点)。
我不能 @ModelAttribute
和 BindingResult
GET方法中的参数(即受Spring约束的参数)对,以便与它们一起调用POST。
那么什么是最好的解决方案呢?
解决方案
我想你可以简单地把你的 new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
使用适当的Spring模型属性名称,这种方式:
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
这是绑定特定model属性的验证结果的默认Spring MVC行为,应该可以帮助您避免 No binding result..
错误
不隶属于 StackOverflow