Запрос предварительной обработки 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
на самом деле является синтетическим, из предыдущего метода (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).Итак, я получил ошибку No binding result is bound to session
(Я согласен с этим).
я не могу иметь @ModelAttribute
и BindingResult
Пара параметров (то, что связано Spring) в методе GET для вызова с ними POST.
Итак, каковы лучшие решения для этого?
Решение
Я думаю, вы можете просто связать свой new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
с соответствующим именем атрибута модели Spring, следующим образом:
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
Это поведение Spring MVC по умолчанию, заключающееся в привязке результатов проверки определенного атрибута модели, и оно должно помочь вам избежать No binding result..
ошибка