参数校验Spring的@Valid注解用法解析

时间:2022-09-05 19:30:15

参数校验spring的@valid注解

@valid 注解通常用于对象属性字段的规则检测。

以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @valid 注解用法详解。

那么,首先,我们会有一个员工对象 employee,如下 :

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class employee {
    /** 姓名 */
    public string name;
 
    /** 年龄 */
    public integer age;
 
    public string getname() {
        return name;
    }
 
    public void setname(string name) {
        this.name = name;
    }
 
    public integer getage() {
        return age;
    }
 
    public void setage(integer age) {
        this.age = age;
    }
}

然后 cotroller 中会有一个对应都新增方法 add():

?
1
2
3
4
5
6
7
8
9
@controller
public class testcontroller {
    @requestmapping("/add")
    @responsebody
    public string add(employee employee) {
        // todo 保存到数据库
        return "新增员工成功";
    }
}

需求变更,要求员工名称不能为空,且长度不超过10个字符

我们的原始写法:

参数校验Spring的@Valid注解用法解析

现在规定年龄也是必填项,且范围在1到100岁,那么此时,我们需要增加判定

参数校验Spring的@Valid注解用法解析

现在员工对象 employee 就 2 个字段,我们就写了 10 多行的代码验证,要是有20个字段,岂不是要写 100 多行代码?

如何解决呢?

将验证过程抽成一个验证方法:

参数校验Spring的@Valid注解用法解析

但这种方式只是抽了一个方法,有一种换汤不换药的感觉,虽然业务方法看起来清爽了很多,但书写代码量并没有下降,反而还多出了一个方法。

此时引出 spring 的 @valid 注解即可:

首先,我们在 maven 配置中引入 @valid 的依赖:

如果你是 springboot 项目,那么可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面。

?
1
2
3
4
5
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
    <version>2.0.5.release</version>
</dependency>

代码优化

首先在 employee 类的属性上打上如下注解:

?
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
import javax.validation.constraints.notblank;
import javax.validation.constraints.notnull;
import org.hibernate.validator.constraints.length;
import org.hibernate.validator.constraints.range;
public class employee {
 
    /** 姓名 */
    @notblank(message = "请输入名称")
    @length(message = "名称不能超过个 {max} 字符", max = 10)
    public string name;
 
    /** 年龄 */
    @notnull(message = "请输入年龄")
    @range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)
    public integer age;
 
    public string getname() {
        return name;
    }
 
    public void setname(string name) {
        this.name = name;
    }
 
    public integer getage() {
        return age;
    }
 
    public void setage(integer age) {
        this.age = age;
    }
}

然后再 controller 对应方法上,对这个员工标上 @valid 注解,表示我们对这个对象属性需要进行验证

参数校验Spring的@Valid注解用法解析

用一个东西来存放验证结果,做法也很简单,在参数直接添加一个bindingresult:

参数校验Spring的@Valid注解用法解析

对应获取验证结果的代码如下:

参数校验Spring的@Valid注解用法解析

@valid与@validated注解

之前项目中参数的校验,都是自己写的判断方法进行校验,这次采用了spring提供的注解进行参数的校验,更为的方便,简洁。

@valid:常见用在方法,类中字段上进行校验

参数校验Spring的@Valid注解用法解析

参数校验Spring的@Valid注解用法解析

@validated:是spring提供的对@valid的封装,常见用在方法上进行校验

参数校验Spring的@Valid注解用法解析

定义的校验类型

@null 验证对象是否为null

@notnull 验证对象是否不为null, 无法查检长度为0的字符串

@notblank 检查约束字符串是不是null还有被trim的长度是否大于0,只对字符串,且会去掉前后空格.

@notempty 检查约束元素是否为null或者是empty.

@creditcardnumber信用卡验证

@email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。

@url(protocol=,host=, port=,regexp=, flags=) ip地址校验

booelan检查

@asserttrue 验证 boolean 对象是否为 true

@assertfalse 验证 boolean 对象是否为 false

长度检查

@size(min=, max=) 验证对象(array,collection,map,string)长度是否在给定的范围之内

?
1
@length(min=, max=) validates that the annotated string is between min and max included.

日期检查

@past 验证 date 和 calendar 对象是否在当前时间之前

@future 验证 date 和 calendar 对象是否在当前时间之后

@pattern 验证 string 对象是否符合正则表达式的规则

数值检查,建议使用在stirng,integer类型,不建议使用在int类型上,因为表单值为""时无法转换为int,但可以转换为stirng为"",integer为null

@min 验证 number 和 string 对象是否大等于指定的值

@max 验证 number 和 string 对象是否小等于指定的值

@decimalmax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过bigdecimal定义的最大值的字符串表示.小数存在精度

@decimalmin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过bigdecimal定义的最小值的字符串表示.小数存在精度

@digits 验证 number 和 string 的构成是否合法

@digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

?
1
@range(min=, max=) checks whether the annotated value lies between (inclusive) the specified minimum and maximum.

注意的几点:

(1)如果一个bean中包含第二个bean

这时要检验第二个bean中某个字段,即嵌套校验,必须要在第一个bean对象中使用@valid标注到表示第二个bean对象的字段上,然后再第二个bean对象里面的字段上加上校验类型

参数校验Spring的@Valid注解用法解析

参数校验Spring的@Valid注解用法解析

(2)@validated支持分组注解

1、先定义一个空接口:groupa

参数校验Spring的@Valid注解用法解析

2、对bean对象中校验类型,添加分组信息,这里我对version字段进行了分组校验信息添加

参数校验Spring的@Valid注解用法解析

3、方法入参中进行分组信息添加

参数校验Spring的@Valid注解用法解析

参数校验Spring的@Valid注解用法解析

如上图所示,则shelveproject方法由于添加了分组信息会校验deleteprojectrequest对象中的version字段是否为空,而offshelveproject方法没有添加分组信息,不会校验version是否为空。

@validated没有添加groups属性时,默认验证没有分组的验证属性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://javaedge.blog.csdn.net/article/details/119030508