如何显示Spring验证器的错误消息?

时间:2012-03-27 11:59:34

标签: spring validation

我已经花了好几个小时在这上面,所以是时候问了。

控制器

@RequestMapping(value="/articleHeaderEdit/{articleId}", method=RequestMethod.POST)
public ModelAndView submitHeader(@PathVariable Integer articleId, @ModelAttribute("screenObject") ArticleHeaderEditScreenObject articleHeaderEditScreenObject, @ModelAttribute("article") Article article, BindingResult bindingResult, Model model, Locale locale) throws Exception {
    validator.validate(articleHeaderEditScreenObject, bindingResult);

    ModelAndView modelAndView=new ModelAndView();

    if(bindingResult.hasErrors()) {
        initializeScreenObject(articleHeaderEditScreenObject, article, locale);
        modelAndView.setViewName(WebView.ARTICLE_HEADER_EDIT_PAGE.getViewName());

    } else {
        modelAndView.setViewName("redirect:/article/" + articleId);
    }

    return modelAndView;
}   

验证

@Component
public class ArticleHeaderEditScreenObjectValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return ArticleHeaderEditScreenObject.class.isAssignableFrom(clazz); 
}

@Override
public void validate(Object validatedObject, Errors errors) {
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "required.title", "Title is required.");
}

查看(仅限相关的html)

<form:form modelAttribute="screenObject" action="${screenObject.getFormAction()}">

    <form:errors path="*" />

    <form:errors />

    <form:input path="title" />
    <form:errors path="title" />

错误就在那里。我得到正确的视图,我通过调试双重检查。但是,这三个错误标签都不起作用。当我提交页面时,它保留了新输入的数据,因此模型工作正常。

我看到很多人都在努力解决这个问题。通常,模型属性在表单和控制器中具有不同的名称,但在这种情况下它们是相同的。知道还缺少什么吗?

1 个答案:

答案 0 :(得分:2)

秘密是按照您传递给submitHeader方法的参数的顺序。

Spring文档明确指出BindingResult bindingResult参数应该在您要验证的模型对象之后写入。

因此,如果您传入多个ModelAttributes,那么具有BindingResult的那个将会将所有错误绑定到该对象。

因此,在您的情况下,BindingResult将具有特定于Article对象而非ArticleHeaderEditScreenObject对象的错误。

春季文档的参考评论:

错误或BindingResult参数必须遵循立即绑定的模型对象,因为方法签名可能包含多个模型对象,而Spring将为每个模型对象创建单独的BindingResult实例,以便以下示例无效:

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#d0e29628