1. Errors对象的作用

当使用当使用Hibernate Validation验证框架验证某字段出错时,spring会将错误消息方法紧跟在方法入参处的Bean后面的Errors对象中。

也就是说,在Springmvc对前台传过来的请求参数进行数据绑定时,若绑定失败、或是校验不通过时,会将对应的错误消息放进Errors对象中。

2. 错误消息的在Errors对象中具体存放形式

Errors对象中利用ObjectError的List保存所有的错误消息,同时也会将字段验证出错的消息放到FieldError的List中。也就是说如果是方法入参处Bean的某个字段验证出错,会将错误消息同时保存到 Errors 的 List<FieldError>List<ObjectError>

3. 错误消息的code值

当方法入参处Bean的某个字段验证出错,会为上述两个List中FieldError对象和ObjectError对象中的codes属性设置多个code值,其格式如下:
- 第一个code值:注解名.Bean的简单类名首字母小写.被验证的属性名,如Pattern.view.viewName
- 第二个code值:注解名.被验证的属性名,如Pattern.viewName
- 第三个code值:注解名.被验证的属性对应的类型的全类名,如Pattern.java.lang.String
- 第四个code值:注解名,如Pattern

FieldError和ObjectError对象调用getCodes()方法返回值就是如上形式,一般前端使用 <form:errors path="viewName"/> 进行错误消息回显时,会根据注解名.Bean的简单类名首字母小写.被验证的属性名这个规范从国际化资源文件中,取该code对应的错误消息去前台页面显示。

4. 手动向Errors对象中添加一条错误消息

可以调用Errors对象的rejectValue()方法向Errors对象添加字段错误消息,如

errors.rejectValue("birth", "Past");
  • 第一个参数是字段名
  • 第二个参数是code值,code值一般只需要给对错误的描述的一个单词或者多个单词(多个单词以驼峰形式连接)即可,框架在生成code值得时候会自动拼接上字段名。上述写法生成的code值在codes数组中的第一个是这样的:Past.user.birth。而像下面这种虽然也可以,但生成的code值会很乱很冗余,因为他还会拼接一次字段名,下面不规范的写法生成的code值类似于这样:Past.user.birth.user.birth
errors.rejectValue("user.birth", "Past.user.birth");