Demande de prétraitement Spring dans une autre méthode de contrôleur
-
11-12-2019 - |
Question
Dans un de mes contrôleurs j'ai :
@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 logique est simple :lorsque l'utilisateur accède à la page de recherche, j'effectue en fait une recherche avec des critères par défaut et je lui renvoie une liste (c'est le résultat de l'évolution des exigences, hein).
J'ai trouvé un problème dans ce code, accidentellement.Lorsque les critères de recherche par défaut ne sont pas valides, le comportement est le suivant :accédez à la recherche -> remplissez les critères de recherche avec des critères non valides -> appelez une autre méthode (la seconde, avec POST) -> effectuez la validation -> errors
ne sont pas vides, alors revenez searchUsers
voir.Mais le BindingResult bindingResult
est en fait synthétique, d'après la méthode précédente (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).J'ai donc une erreur No binding result is bound to session
(Je suis d'accord avec ça).
Je ne peux pas avoir @ModelAttribute
et BindingResult
les paramètres (ceux qui sont liés par Spring) s'associent dans la méthode GET pour appeler POST avec eux.
Alors, quelles sont les meilleures solutions pour cela ?
La solution
Je pense que vous pouvez simplement associer votre new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
avec un nom d'attribut de modèle Spring approprié, de cette façon :
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
Il s'agit du comportement par défaut de Spring MVC consistant à lier les résultats de validation d'un attribut de modèle spécifique et devrait vous aider à éviter le No binding result..
erreur