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>
1
2
3
4
5
6
7
8
9
10
11
12
13
使用注解(303规范用于约束bean的属性)
User
public class User {
//此注解表示该属性不能为空
@NotBlank(message = "姓名不能为空")
private String name;
private Integer age;
//构造方法、get、set方法省略...
}
1
2
3
4
5
6
7
8
在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);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
页面表单
<form action="/standard/demo">
姓名:<input type="text" name="name">
年龄:<input type="text" name="age">
<input type="submit" value="提交">
</form>
1
2
3
4
5
结果
对同一个字段进行多个约束条件的校验
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方法省略...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
控制层方法与页面表单不变
对引用类型的校验
对于引用类型的校验,需要在引用字段上加上@Valid注解,表示开启注解,而在其引用的类的字段上,需要编写校验规则。
User.java
public class User {
private String name;
private Integer age;
//开启校验
@Valid
private Address address;
//get set方法省略
}
1
2
3
4
5
6
7
8
9
10
11
Address.java
public class Address {
@NotBlank(message = "地址不能为空!")
private String name;
//get set方法省略
}
1
2
3
4
5
6
7
表单
<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>
1
2
3
4
5
6
控制层处理方法不变
结果
分组校验
首先创建一个接口,用于做分组,里面什么都不用写,只是当做一个分组标识
public interface GroupA {
}
1
2
将不同的校验规则进行分组
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方法省略
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
表单
<form action="/standard/demo">
姓名:<input type="text" name="name">
年龄:<input type="text" name="age">
<input type="submit" value="提交">
</form>
1
2
3
4
5
在控制层使用@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);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Validated(GroupA.class)表示只针对A组的规则进行校验。
结果