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?

È stato utile?

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..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top