一、为什么需要用到验证?

     虽然数据验证与业务逻辑代码关系不大,但是可能由于忽略加验证被别人钻了空子就不堪设想。如果我们自己写校验代码的话,第一太麻烦 重复的代码很多 显得太冗余很难维护 其次我们的每次都要去检验 该验证是否可靠 很浪费时间。所以我们一般会用到hibernate validation帮我们加强验证用来保证数据的真实性和程序的安全性

二、关于hibernate-validator常用注解

注解 说明
@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=) 被注释的元素必须符合指定的正则表达式
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

三、使用hibernate-validator

1、创建TestEntity.class 实体

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
27
28
29
30
31
32
33
34
@Data
public class TestEntity {
/**
* 非空校验、长度必须在2~4之间
*/
@NotBlank
@Length(min = 2, max = 4)
private String name;

/**
* 最小为18岁
*/
@Min(value = 18)
private int age;

/**
* 必须要符合该正则
*/
@Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$")
private String birthday;

/**
* 非空校验、必须符合邮箱规则
*/
@NotBlank
@Email
private String mail;

/**
* 必须要为fasle
*/
@AssertFalse()
private Boolean isFalse;
}

2、创建IndexControl.class 控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class IndexControl {

@RequestMapping(value = "/")
public String index(@Valid TestEntity entity, BindingResult result) {
StringBuffer msg = new StringBuffer();
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
msg.append(error.getDefaultMessage() + "&&");
}
return msg.toString();
}
return "验证通过";
}
}

3、进行测试

四、创建一个简单的约束条件

详情参考hibernate官方文档

如果hibernate-validator 提供给我们的验证不符合开发的需求时,我们可以自定义验证器。案例 验证性别只能是男or女
1、创建约束标注

1
2
3
4
5
6
7
8
9
10
11
12
13
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = CheckGenderClass.class)
public @interface CheckGender {
String values();

String message() default "gender只能是男or女";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}

2、实现一个验证器

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
public class CheckGenderClass implements ConstraintValidator<CheckGender, Object> {

private String values;

// 初始化验证消息
@Override
public void initialize(CheckGender constraintAnnotation) {
this.values = constraintAnnotation.values();
}

// 执行验证
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
// 用‘ , ’分割传入的值
String[] array = values.split(",");
boolean flag = false;
for (int i = 0; i < array.length; i++) {
if (array[i].equals(value)) {
flag = true;
break;
}
}
return flag;
}
}

3、使用自定义验证器

1
2
3
4
5
6
7
8
9
10
@Data
public class TestEntity {

/**
* @CheckGender即为我们自定义的注解
*/
@NotBlank
@CheckGender(values = "男,女")
private String gender;
}

4、还是使用IndexControl.class 控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class IndexControl {

@RequestMapping(value = "/")
public String index(@Valid TestEntity entity, BindingResult result) {
StringBuffer msg = new StringBuffer();
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
msg.append(error.getDefaultMessage() + "&&");
}
return msg.toString();
}
return "验证通过";
}
}

S.png
5、进行测试