다른 컨트롤러 방법에서 Spring Preprocess 요청
-
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;
}
.
로직은 간단합니다. 사용자가 검색 페이지로 이동하면 실제로 기본 기준으로 검색을 수행하고 목록을 반환합니다 (이것은 요구 사항 변경, HUH)의 결과입니다.
실수 로이 코드에서 문제를 발견했습니다.기본 검색 기준이 유효하지 않을 때 다음과 같습니다. 검색 -> 유효하지 않은 기준으로 검색 -> 검색 기준을 탐색 -> 다른 메소드 (POST와 함께 두 번째 하나씩) -> 유효성 검사 수행 -> errors
가 비어 있지 않으므로 searchUsers
보기를 반환합니다....에그러나 BindingResult bindingResult
는 실제로 이전 메소드 (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
)에서 Syntethic입니다.그래서 나는 No binding result is bound to session
오류가 발생했습니다 (이에 동의 함).
@ModelAttribute
및 BindingResult
매개 변수를 가질 수 없습니다 (Spring에 의해 바인드 된 것)에서 Pair를 호출하는 데있어 Post를 호출하십시오.
그래서 이것을위한 가장 좋은 해결책은 무엇입니까?
해결책
EneraCodiceTag 코드를 적절한 Spring 모델 속성 이름으로 단순히 연결할 수 있습니다.이 방법으로 다음을 수행하십시오.
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
.
특정 모델 속성의 유효성 검사 결과를 바인딩하는 기본 Spring MVC 동작이며 new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
오류 를 피해야합니다.