JAVA中通过Hibernate-Validation进行参数验证

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组的规则进行校验。

结果


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值