如何显示来自Spring验证程序的错误消息?

如何显示来自Spring验证程序的错误消息?,spring,validation,Spring,Validation,我在这上面花了好几个小时,所以是时候问问了 控制器 @RequestMapping(value="/articleHeaderEdit/{articleId}", method=RequestMethod.POST) public ModelAndView submitHeader(@PathVariable Integer articleId, @ModelAttribute("screenObject") ArticleHeaderEditScreenObject articleHeader

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

控制器

@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.");
}
验证程序

@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.");
}
@组件
公共类ArticleHeaderEditScreenObjectValidator实现验证器{
@凌驾
公共布尔支持(类clazz){
返回ArticleHeaderEditScreenObject.class.isAssignableFrom(clazz);
}
@凌驾
公共无效验证(对象验证对象,错误){
ValidationUtils.rejectIfEmptyOrWhitespace(错误,“标题”,“必需的.标题”,“标题是必需的”);
}
查看(仅相关html)


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


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

秘密在于传递给
submitHeader
方法的参数的顺序

Spring文档明确规定,
BindingResult
参数应该写在您想要验证的模型对象之后

因此,如果要传入多个ModelAttributes,则在其之后具有BindingResult的ModelAttributes将所有错误绑定到该对象

因此,在您的情况下,BindingResult将有特定于
文章
对象的错误,而不是
文章标题编辑屏幕对象
对象

spring文档中的参考注释:

错误或BindingResult参数必须紧跟在立即绑定的模型对象之后,因为方法签名可能有多个模型对象,Spring将为每个模型对象创建一个单独的BindingResult实例,因此以下示例不起作用:


你能发布你的验证器代码吗?我已经添加了验证器并更新了代码。我仍在努力工作。原来Spring对文章中的第二个模型属性感到困惑。当我拿出
@modeldattribute(“文章”)时文章文章
从参数列表中,错误显示在页面上。非常非常混乱的东西。。。