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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top