我已经花了好几个小时在这上面,所以是时候问了。
控制器
@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" />
错误就在那里。我得到正确的视图,我通过调试双重检查。但是,这三个错误标签都不起作用。当我提交页面时,它保留了新输入的数据,因此模型工作正常。
我看到很多人都在努力解决这个问题。通常,模型属性在表单和控制器中具有不同的名称,但在这种情况下它们是相同的。知道还缺少什么吗?
答案 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