Springは別のコントローラメソッドで要求を前処理します
-
11-12-2019 - |
質問
私のコントローラの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
(私はこれに同意します)。
私は持つことができません @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..
エラー