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 ?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top