SpringMVC数据校验采用JSR-303校验。
• Spring4.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架。
• Spring在进行数据绑定时,可同时调用校验框架完成数据校验工作。在Spring MVC中,可直接通过@Valid注解驱动的方式进行数据校验
• Spring的LocalValidatorFactroyBean既实现了Spring的Validator接口,也实现了JSR 303的 Validator接口。只要在Spring容器中定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
• Spring本身并没有提供JSR303的实现,Hibernate Validator是JSR 303的一个参考实现,这里我们就采用Hibernate validator。在新建Spring Boot项目后添加以下依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.0.Final</version>
</dependency>
1.校验示例
public class Student implements Serializable {
@DecimalMin("10")
private Long sid;
@NotNull
@Pattern(regexp = "b.*")
private String name;
@Past
@JsonSerialize(using = CustomDateSerializer.class)
private Date birthday;
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
2.国际化
为了在校验和数据转换失败时输出我们自定义的错误信息,我们需要在/static/i18n/messages.properties文件中配置国际化资源文件。格式为:
校验注解名.类名全小写.类中的属性=xxxxx
DecimalMin.student.sid=ID必须大于10喔^-^
NotNull.student.name=名字不能为空喔
Pattern.student.name=名字必须以b开头喔
Past.student.birthday=亲,您是穿越了嘛!
3.测试方法
通过在处理方法的入参上标注@valid注解即可让Spring MVC在完成数据绑定后执行数据校验的工作
• 在已经标注了JSR303注解的表单/命令对象前标注一个@Valid,Spring MVC 框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
• Spring MVC是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是 BindingResult 或Errors 类型,这两个类都位于
org.springframework.validation 包中
• 需校验的 Bean 对象和其绑定结果对象或错误对象时成对出现的,它们之间不允许声明其他的入参
• Errors 接口提供了获取错误信息的方法,如 getErrorCount() 或getFieldErrors(String field)
• BindingResult扩展了Errors接口

@RequestMapping("testvalid")
public String TestValid(
@Valid//如果需要校验则需要驾驶@Valid注解
@ModelAttribute("student")
Student student,
Errors errors, Map<String, Object> map) {
System.out.println(student);
if (errors.hasErrors()) {
System.out.println("这里有一些错误");
for (FieldError fieldError :
errors.getFieldErrors()) {
System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
}
return "forward:/input.jsp";
}
map.put("msg", "转换并校验成功了!");
return "success";
}
4.页面
<!DOCTYPE html>
" />