Solicitud de preproceso de primavera en otro método de controlador
-
11-12-2019 - |
Pregunta
En uno de mis controladores tengo:
@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;
}
La lógica es simple:cuando el usuario navega a la página de búsqueda, realizo una búsqueda con criterios predeterminados y le devuelvo una lista (este es el resultado del cambio de requisitos, eh).
Encontré un problema en este código accidentalmente.Cuando los criterios de búsqueda predeterminados no son válidos, el comportamiento es:navegue hasta buscar -> complete los criterios de búsqueda con criterios no válidos -> llame a otro método (el segundo, con POST) -> realice la validación -> errors
no están vacíos, así que regresa searchUsers
vista.Pero el BindingResult bindingResult
es en realidad sintético, del método anterior (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).Entonces me salió un error No binding result is bound to session
(Estoy de acuerdo con ésto).
No puedo tener @ModelAttribute
y BindingResult
Los parámetros (que están vinculados por Spring) se emparejan en el método GET para llamar a POST con ellos.
Entonces, ¿cuáles son las mejores soluciones para esto?
Solución
Creo que puedes simplemente asociar tu new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
con un nombre de atributo de modelo Spring apropiado, de esta manera:
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
Este es el comportamiento predeterminado de Spring MVC de vincular los resultados de validación de un atributo de modelo específico y debería ayudarlo a evitar el No binding result..
error