另一个控制器方法中的Spring预处理请求

时间:2012-09-29 20:13:31

标签: spring validation spring-mvc modelandview

在我的一个控制器中,我有:

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

逻辑很简单:当用户导航到搜索页面时,我实际上使用默认条件执行搜索并返回一个列表(这是需求更改的结果,呵呵)。

我意外地在此代码中发现了一个问题。当默认搜索条件无效时,行为是:导航到搜索 - &gt;使用无效条件填充搜索条件 - &gt;调用另一种方法(第二种方法,使用POST) - &gt;执行验证 - &gt; errors不为空,因此请返回searchUsers视图。但BindingResult bindingResult实际上是同义词,来自之前的方法(new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria"))。所以我收到了错误No binding result is bound to session(我同意这一点)。

我不能在GET方法中使用@ModelAttributeBindingResult参数(由Spring绑定)参数来调用POST。

那么最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

我认为你可以简单地将你的new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")与适当的Spring模型属性名称相关联,这样:

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

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

这是绑定特定模型属性的验证结果的默认Spring MVC行为,应该可以帮助您避免No binding result..错误