我对这个带注释的 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());
}
// ...
}
// ....
}
逻辑完美。如果出现绑定错误,则从 action 方法调用 render 方法并重新加载页面。问题是我无法在 JSP 页面上打印验证错误。
我有一个类似的控制器实现了添加操作(AddQuestionController),并在那里打印了消息。不同之处在于 this 有一个会话对象(另一个没有),另一个有一个用 @ModelAttribute 注释的方法,而 this 没有。
如果我在 AddQuestionController 上删除 @ModelAttribute 注释方法,则不再打印错误消息。我认为在这个上添加一个类似的方法可以解决问题,但它没有用。
谁能告诉我我做错了什么?
谢谢!