Hibernate-Validation?
Hibernate-Validation是Hibernate框架中一套独立的后端校验框架,用于做参数的验证的;它是JSR303-Bean Validation规范的实现方案。
JSR?
JSR是Java Specification Requests的缩写,意思是Java 规范提案,用于指定java的标准。
Bean Validation?
Bean Validation是JSR中的303规范,用于提供Bean属性的相关校验规则。
Hibernate Validation提供的约束注解
-
Bean Validation 中内置的约束注解
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式 -
Hibernate Validator 附加的约束注解
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@NotNull @NotEmpty @NotBlank三个注解的区别
@NotNull 任何对象的value不能为null
@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank 只能用于字符串不为null,并且字符串trim()去掉空格,以后length要大于0
使用实例
-
添加依赖
pom.xml
<!--导入校验的jsr303规范API--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!--导入校验框架实现技术--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.0.Final</version> </dependency>
-
使用注解(303规范用于约束bean的属性)
User
public class User { //此注解表示该属性不能为空 @NotBlank(message = "姓名不能为空") private String name; private Integer age; //构造方法、get、set方法省略... }
-
在Controller层校验
校验方法
/** * @param user 用户实体 * @param errors 错误对象 */ @RequestMapping("/standard/demo") @ResponseBody public void demo(@Valid User user, Errors errors) { System.out.println(user); //判断对象中是否有错误,false表示没有错误, true表示有错误 boolean bl = errors.hasErrors(); if (bl) { //获取字段的错误集合 List<FieldError> fieldErrors = errors.getFieldErrors(); //遍历 for (FieldError fieldError : fieldErrors) { //获取出现错误的字段名 String field = fieldError.getField(); //获取出现错误的字段消息 String defaultMessage = fieldError.getDefaultMessage(); System.out.println(field); System.out.println(defaultMessage); } } }
-
页面表单
<form action="/standard/demo"> 姓名:<input type="text" name="name"> 年龄:<input type="text" name="age"> <input type="submit" value="提交"> </form>
-
结果
对同一个字段进行多个约束条件的校验
public class User {
//此注解表示该属性不能为空
@NotBlank(message = "姓名不能为空")
private String name;
//首先不能为空校验
@NotNull(message = "年龄不能为空")
//对年龄的大小进行范围校验
@Max(value = 60,message = "最大年龄不能超过60")
@Min(value = 18,message = "最小年龄不能低于18")
private Integer age;
//构造方法、get、set方法省略...
}
控制层方法与页面表单不变
对引用类型的校验
对于引用类型的校验,需要在引用字段上加上@Valid注解,表示开启注解,而在其引用的类的字段上,需要编写校验规则。
-
User.java
public class User { private String name; private Integer age; //开启校验 @Valid private Address address; //get set方法省略 }
-
Address.java
public class Address { @NotBlank(message = "地址不能为空!") private String name; //get set方法省略 }
-
表单
<form action="/standard/demo"> 姓名:<input type="text" name="name"> 年龄:<input type="text" name="age"> 地址:<input type="text" name="address.name"> <input type="submit" value="提交"> </form>
-
控制层处理方法不变
-
结果
分组校验
-
首先创建一个接口,用于做分组,里面什么都不用写,只是当做一个分组标识
public interface GroupA { }
-
将不同的校验规则进行分组
User.java
public class User { /* 此注解表示该属性不能为空 groups = {GroupA.class}:校验规则加入A组 */ @NotBlank(message = "姓名不能为空", groups = {GroupA.class}) private String name; //首先不能为空校验 @NotNull(message = "年龄不能为空") //对年龄的大小进行范围校验 @Max(value = 60,message = "最大年龄不能超过60") @Min(value = 18,message = "最小年龄不能低于18") private Integer age; //get set方法省略 }
-
表单
<form action="/standard/demo"> 姓名:<input type="text" name="name"> 年龄:<input type="text" name="age"> <input type="submit" value="提交"> </form>
-
在控制层使用@Validated注解,指定对哪组的规则进行校验
/** * @param user 用户实体 * @param errors 错误对象 */ @RequestMapping("/standard/demo") @ResponseBody public void demo(@Validated(GroupA.class) User user, Errors errors) { System.out.println(user); //判断对象中是否有错误,false表示没有错误, true表示有错误 boolean bl = errors.hasErrors(); if (bl) { //获取字段的错误集合 List<FieldError> fieldErrors = errors.getFieldErrors(); //遍历 for (FieldError fieldError : fieldErrors) { //获取出现错误的字段名 String field = fieldError.getField(); //获取出现错误的字段消息 String defaultMessage = fieldError.getDefaultMessage(); System.out.println(field); System.out.println(defaultMessage); } } }
@Validated(GroupA.class)表示只针对A组的规则进行校验。
-
结果