この注釈付きのSpringコントローラーには厄介な検証の問題があります(以下の関連部分):
@RequestMapping(value="view")
@SessionAttributes(types = UserChoice.class)
@Controller(value="takeSurveyController")
public class TakeSurveyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Answer.class, new AnswerPropertyEditor(getAnswerService()));
}
// ------------------------------------------------------------------------|
@RenderMapping(params="action=showQuestionForUserForm")
public String showQuestionForUserForm(@RequestParam("surveyID") Long surveyId,
@RequestParam(value="questionID", required=false) Long questionId,
RenderRequest request, Model model) {
// ...
return "questionForUserShow";
}
// ------------------------------------------------------------------------|
@ActionMapping(params="action=submitUserChoice")
public void submitAnswerForm(@ModelAttribute("userChoice") UserChoice userChoice,
BindingResult bindingResult, ActionRequest request, ActionResponse response) {
// ...
getUserChoiceValidator().validate(userChoice, bindingResult);
if (!bindingResult.hasErrors()) {
getUserChoiceService().save(userChoice);
// ...
}
else {
// binding errors: reload current question
response.setRenderParameter("action", "showQuestionForUserForm");
response.setRenderParameter("surveyID", survey.getId().toString());
response.setRenderParameter("questionID", currentQuestion.getId().toString());
}
// ...
}
// ....
}
ロジックは完全に機能します。バインディング エラーが発生すると、アクション メソッドからレンダリング メソッドが呼び出され、ページがリロードされます。問題は、JSP ページに出力された検証エラーを取得できないことです。
追加操作 (AddQuestionController) を実装する同様のコントローラーがあり、そこにメッセージが出力されます。違いは、これにはセッション オブジェクトがあり (もう一方にはありません)、もう一方には @ModelAttribute アノテーションが付けられたメソッドがありますが、これにはありません。
AddQuestionController で @ModelAttribute アノテーション付きメソッドを削除すると、エラー メッセージが出力されなくなります。これに同様のメソッドを追加すると問題が解決すると思いましたが、うまくいきませんでした。
誰が私が間違っているのか教えてもらえますか?
ありがとう!