Запрос предварительной обработки Spring в другом методе контроллера

StackOverflow https://stackoverflow.com//questions/12656111

Вопрос

В одном из моих контроллеров у меня есть:

@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;
}

Логика проста:когда пользователь переходит на страницу поиска, я фактически выполняю поиск с критериями по умолчанию и возвращаю ему список (это результат изменения требований, да).

Я случайно нашел проблему в этом коде.Если критерии поиска по умолчанию недействительны, поведение следующее:перейдите к поиску -> заполните критерии поиска недопустимыми критериями -> вызовите другой метод (второй, с POST) -> выполните проверку -> errors не пусты, поэтому верните searchUsers вид.Но BindingResult bindingResult на самом деле является синтетическим, из предыдущего метода (new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")).Итак, я получил ошибку No binding result is bound to session (Я согласен с этим).

я не могу иметь @ModelAttribute и BindingResult Пара параметров (то, что связано Spring) в методе GET для вызова с ними POST.

Итак, каковы лучшие решения для этого?

Это было полезно?

Решение

Я думаю, вы можете просто связать свой new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria") с соответствующим именем атрибута модели Spring, следующим образом:

  BindingResult bindingResult = new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")

model.addAttribute(BindingResult.MODEL_KEY_PREFIX + "userSearchCriteria", bindingResult);

Это поведение Spring MVC по умолчанию, заключающееся в привязке результатов проверки определенного атрибута модели, и оно должно помочь вам избежать No binding result.. ошибка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top