gpt4 book ai didi

Spring中校验器(Validator)的深入讲解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Spring中校验器(Validator)的深入讲解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

spring框架的 validator 组件,是个辅助组件,在进行数据的完整性和有效性非常有用,通过定义一个某个验证器,即可在其它需要的地方,使用即可,非常通用.

Spring中校验器(Validator)的深入讲解

应用在执行业务逻辑之前,必须通过校验保证接受到的输入数据是合法正确的,但很多时候同样的校验出现了多次,在不同的层,不同的方法上,导致代码冗余,浪费时间,违反dry原则.

  • 每一个控制器都要校验
  • 过多的校验参数会导致代码太长
  • 代码的复用率太差,同样的代码如果出现多次,在业务越来越复杂的情况下,维护成本呈指数上升。

可以考虑把校验的代码封装起来,来解决出现的这些问题.

jsr-303 。

jsr-303是java为bean数据合法性校验提供的标准框架,它定义了一套可标注在成员变量,属性方法上的校验注解。 hibernate validation提供了这套标准的实现,在我们引入spring boot web starter或者spring boot starter validation的时候,默认会引入hibernate validation.

用法实例 。

说了这么多废话,上代码.

1、引入springboot项目 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
  <groupid>org.hibernate.validator</groupid>
  <artifactid>hibernate-validator</artifactid>
</dependency>
<!-- 引入lomhok -->
<dependency>
  <groupid>org.projectlombok</groupid>
  <artifactid>lombok</artifactid>
</dependency>

2、编写校验对象 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@data
public class user {
  // 名字不允许为空,并且名字的长度在2位到30位之间
  // 如果名字的长度校验不通过,那么提示错误信息
  @notnull
  @size (min= 2 , max= 30 ,message = "请检查名字的长度是否有问题" )
  private string name;
 
  // 不允许为空,并且年龄的最小值为18
  @notnull
  @min ( 18 )
  private integer age;
}

3、创建控制器 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@springbootapplication
@restcontroller
public class userapplication{
  public static void main(string[] args) {
  springapplication.run(userapplication. class ,args);
  }
 
  // 1. 要校验的参数前,加上@valid注解
  // 2. 紧随其后的,跟上一个bindingresult来存储校验信息
  @requestmapping ( "/test1" )
  public object test1(
   @valid user user,
   bindingresult bindingresult
  ) {
  //如果检验出了问题,就返回错误信息
  // 这里我们返回的是全部的错误信息,实际中可根据bindingresult的方法根据需要返回自定义的信息。
  // 通常的解决方案为:jsr-303 + 全局exceptionhandler
  if (bindingresult.haserrors()){
   return bindingresult.getallerrors();
  }
  return "ok" ;
  }
}

4、运行应用 。

稍作演示下运行的结果,可以看出校验框架已经生效了.

校验年龄 。

Spring中校验器(Validator)的深入讲解

校验名称 。

Spring中校验器(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=) 被注释的元素必须符合指定的正则表达式 。

hibernate validator提供的校验注解:

@notblank(message =) 验证字符串非null,且长度必须大于0 。

@email 被注释的元素必须是电子邮箱地址 。

@length(min=,max=) 被注释的字符串的大小必须在指定的范围内 。

@notempty 被注释的字符串的必须非空 。

@range(min=,max=,message=) 被注释的元素必须在合适的范围内 。

自定义校验注解 。

有时候,第三方库中并没有我们想要的校验类型,好在系统提供了很好的扩展能力,我们可以自定义检验。 比如,我们想校验用户的手机格式,写手机号码校验器 。

1、编写校验注解 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 我们可以直接拷贝系统内的注解如@min,复制到我们新的注解中,然后根据需要修改。
@target ({method, field, annotation_type, constructor, parameter})
@retention (runtime)
@documented
//注解的实现类。
@constraint (validatedby = {ismobilevalidator. class })
public @interface ismobile {
  //校验错误的默认信息
  string message() default "手机号码格式有问题" ;
  //是否强制校验
  boolean isrequired() default false ;
  class <?>[] groups() default {};
  class <? extends payload>[] payload() default {};
}

2、编写具体的实现类 。

我们知道注解只是一个标记,真正的逻辑还要在特定的类中实现,上一步的注解指定了实现校验功能的类为ismobilevalidator.

?
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
35
36
// 自定义注解一定要实现constraintvalidator接口奥,里面的两个参数
// 第一个为 具体要校验的注解
// 第二个为 校验的参数类型
public class ismobilevalidator implements constraintvalidator<ismobile, string> {
 
  private boolean required = false ;
 
  private static final pattern mobile_pattern = pattern.compile( "1\\d{10}" );
  //工具方法,判断是否是手机号
  public static boolean ismobile(string src) {
   if (stringutils.isempty(src)) {
    return false ;
   }
   matcher m = mobile_pattern.matcher(src);
   return m.matches();
  }
 
  @override
  public void initialize(ismobile constraintannotation) {
   required = constraintannotation.isrequired();
  }
 
  @override
  public boolean isvalid(string phone, constraintvalidatorcontext constraintvalidatorcontext) {
   //是否为手机号的实现
   if (required) {
    return ismobile(phone);
   } else {
    if (stringutils.isempty(phone)) {
     return true ;
    } else {
     return ismobile(phone);
    }
   }
  }
}

3、测试自定义注解的功能 。

?
1
2
3
4
5
6
7
8
9
10
11
12
@data
public class user {
  @notnull
  @size (min= 2 , max= 30 ,message = "请检查名字的长度是否有问题" )
  private string name;
  @notnull
  @min ( 18 )
  private integer age;
  //这里是新添加的注解奥
  @ismobile
  private string phone;
}

4、测试 。

Spring中校验器(Validator)的深入讲解

通过 。

Spring中校验器(Validator)的深入讲解

手机号有问题 。

可以看出自定义的注解已经生效了.

我们还可以继续优化的地方,新建一个全局的异常,如果校验失败的话,抛出全局的业务异常,捕获业务异常,然后返回用户友好的提示信息.

额外 。

也可以通过方法的校验.

1、控制器上添加@validated注解 。

2、在控制器的方法上添加校验注解,@min,@max等.

?
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
@validated
@restcontroller
@springbootapplication
public class userapplication{
  public static void main(string[] args) {
   springapplication.run(userapplication. class ,args);
  }
 
  @requestmapping ( "/test2" )
  public string test2(
    @ismobile string phone
 
  ){
   return phone + "ok" ;
  }
 
  @exceptionhandler (constraintviolationexception. class )
  @responsebody
  public object handleconstraintviolationexception(constraintviolationexception cve){
 
   hashset<string> messageset = new hashset();
   for (constraintviolation constraintviolation : cve.getconstraintviolations()) {
    messageset.add(constraintviolation.getmessage());
   }
   return messageset;
  }
}

Spring中校验器(Validator)的深入讲解

类的校验规则 。

最后 。

通过使用校验器,所有的控制器,我们都不用再去做校验啦,代码再回看是不是清爽很多。我们写代码很简答,但是一定要想到如何把代码写的更简单,更清晰,更利于维护,写重复的代码是在浪费自己的时间奥.

以后再碰到参数校验的情况,首先想到的不是直接就去校验,可以查找自己是否写过某一类的验证器,可以直接拿来即用.

总结 。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.

原文链接:https://www.jianshu.com/p/2e6fd6d625cd 。

最后此篇关于Spring中校验器(Validator)的深入讲解的文章就讲到这里了,如果你想了解更多关于Spring中校验器(Validator)的深入讲解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com