Richiesta di preprocesso di primavera in un altro metodo del controller
-
11-12-2019 - |
Domanda
In uno dei miei controller ho:
@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 logica è semplice: quando l'utente naviga alla pagina di ricerca, eseguo effettivamente una ricerca con criteri predefiniti e restituirgli un elenco (questo è il risultato dei requisiti che cambiano, HUH).
Ho trovato un problema in questo codice, accidentalmente.Quando i criteri di ricerca predefiniti non sono validi, il comportamento è: Passare a cercare -> Comportamento dei criteri di ricerca con criteri di ricerca con criteri non validi -> Chiama un altro metodo (il secondo, con Post) -> Eseguire la convalida -> errors
non è vuoto, quindi restituire searchUsers
View.Ma il BindingResult bindingResult
è effettivamente sintetico, dal metodo precedente (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
).Quindi ho ricevuto un errore No binding result is bound to session
(sono d'accordo con questo).
Non posso avere i parametri @ModelAttribute
e BindingResult
(che, che sono legati dalla primavera) coppia in ottieni metodo per chiamare il post con loro.
Allora, quali sono le migliori soluzioni per questo?
Soluzione
Penso che puoi semplicemente associare il tuo new BeanPropertyBindingResult(userSearchCriteria,
"userSearchCriteria")
con un nome di attributo modello di molla appropriato, in questo modo:
BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")
model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);
.
Questo è il comportamento predefinito della molla MVC del legame i risultati di convalida di un attributo del modello specifico e dovrebbe aiutarti a evitare l'errore No binding result..