質問

私のコントローラの1つで私は持っています:

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

ロジックは簡単です:ユーザーが検索ページに移動すると、私は実際にデフォルトの基準で検索を実行し、彼にリストを返します(これは要件の変更の結果です)。

私は誤ってこのコードで問題を見つけました。デフォルトの検索条件が有効でない場合、動作は次のようになります:検索に移動->無効な基準で検索条件を入力->別のメソッド(2番目のメソッド、POST)を呼び出す->検証を実行する-> errors 空ではないので、戻ります searchUsers ビュー。しかし、 BindingResult bindingResult は実際には、前のメソッドから(new BeanPropertyBindingResult(userSearchCriteria, "userSearchCriteria")).だから私はエラーを得た No binding result is bound to session (私はこれに同意します)。

私は持つことができません @ModelAttributeBindingResult パラメータ(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