1

我对这个带注释的 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 注释方法,则不再打印错误消息。我认为在这个上添加一个类似的方法可以解决问题,但它没有用。

谁能告诉我我做错了什么?

谢谢!

4

1 回答 1

0

David Rosell 在 2011 年 7 月 1 日就这个问题提出的解决方法似乎解决了这个问题。

于 2013-05-15T15:42:25.687 回答