Solicitação de pré-processamento Spring em outro método de controlador
-
11-12-2019 - |
Pergunta
Em um dos meus controladores eu tenho:
@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;
}
A lógica é simples:quando o usuário navega para a página de pesquisa, eu realmente realizo uma pesquisa com critérios padrão e retorno uma lista (isso é o resultado da mudança de requisitos, hein).
Encontrei um problema neste código, acidentalmente.Quando os critérios de pesquisa padrão não são válidos, o comportamento é:navegue até pesquisar -> preencha os critérios de pesquisa com critérios inválidos -> chame outro método (o segundo, com POST) -> execute a validação -> errors
não estão vazios, então retorne searchUsers
visualizar.Mas o BindingResult bindingResult
é na verdade sintético, do método anterior (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).Então eu recebi um erro No binding result is bound to session
(Eu concordo com isto).
Eu não posso ter @ModelAttribute
e BindingResult
parâmetros (que são vinculados pelo Spring) emparelham no método GET para chamar POST com eles.
Então, quais são as melhores soluções para isso?
Solução
Eu acho que você pode simplesmente associar seu new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
com um nome de atributo de modelo Spring apropriado, desta forma:
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
Este é o comportamento padrão do Spring MVC de vincular os resultados da validação de um atributo de modelo específico e deve ajudá-lo a evitar o No binding result..
erro