如何显示来自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(“文章”)时文章文章
从参数列表中,错误显示在页面上。非常非常混乱的东西。。。