Spring-Vorverarbeitungsanforderung in einer anderen Controller-Methode
-
11-12-2019 - |
Frage
In einem meiner Controller habe ich:
@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;
}
Die Logik ist einfach:Wenn der Benutzer zur Suchseite navigiert, führe ich tatsächlich eine Suche mit Standardkriterien durch und sende ihm eine Liste zurück (das ist das Ergebnis geänderter Anforderungen, nicht wahr).
Ich habe versehentlich ein Problem in diesem Code gefunden.Wenn die Standardsuchkriterien nicht gültig sind, tritt folgendes Verhalten auf:Navigieren Sie zur Suche -> füllen Sie Suchkriterien mit ungültigen Kriterien -> rufen Sie eine andere Methode auf (die zweite, mit POST) -> führen Sie die Validierung durch -> errors
nicht leer sind, also zurückgeben searchUsers
Sicht.Aber die BindingResult bindingResult
ist tatsächlich synthetisch, aus der vorherigen Methode (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).Ich habe also einen Fehler erhalten No binding result is bound to session
(Ich stimme dem zu).
Ich kann nicht haben @ModelAttribute
Und BindingResult
Parameter (die durch Spring gebunden sind) werden in der GET-Methode gepaart, um POST mit ihnen aufzurufen.
Was sind also die besten Lösungen dafür?
Lösung
Ich denke, Sie können einfach Ihre assoziieren new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
mit einem geeigneten Spring-Modellattributnamen auf diese Weise:
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
Dies ist das Standardverhalten von Spring MVC beim Binden der Validierungsergebnisse eines bestimmten Modellattributs und soll Ihnen helfen, das zu vermeiden No binding result..
Fehler