Spring请求参数校验功能实例演示

时间:2021-11-06 06:21:21

springmvc支持的数据校验是jsr303的标准,通过在bean的属性上打上@notnull、@max等进行验证。jsr303提供有很多annotation接口,而springmvc对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包:

依赖引用

?
1
2
compile 'javax.validation:validation-api:2.0.0.final'
compile 'org.hibernate:hibernate-validator:6.0.0.final'

框架已经提供校验如下:

jsr提供的校验注解:     

@null   被注释的元素必须为 null   
@notnull    被注释的元素必须不为 null,不能为 null , 可以为 ""   
@asserttrue     被注释的元素必须为 true   
@assertfalse    被注释的元素必须为 false   
@min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值   
@max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值   
@decimalmin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值   
@decimalmax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值   
@size(max=, min=)   验证对象(array,collection,map,string)长度是否在给定的范围之内   
@digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内   
@past   被注释的元素必须是一个过去的日期   
@future     被注释的元素必须是一个将来的日期   
@pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式   

hibernate validator提供的校验注解: 

@notblank(message =)   只能作用在string上,不能为null,而且调用trim()后,长度必须大于0   
@email  被注释的元素必须是电子邮箱地址   
@length(min=,max=)  被注释的字符串的大小必须在指定的范围内   
@notempty   被注释的字符串的必须非空,不能为 null、"",可以为 " "   
@range(min=,max=,message=)  被注释的元素必须在合适的范围内

实例演示

创建需要被校验的实体类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.yiba.wifi.news.bean.model;
import org.hibernate.validator.constraints.length;
import javax.validation.constraints.*;
public class user {
  @notblank(message = "用户名不能为null,长度必须大于0")
  string name;  //用户名
  @min(value = 1, message = "最小年龄为1岁")
  @max(value = 120, message = "最大年龄为120岁")
  integer age; //年龄
  @email(message = "邮箱格式错误")
  @notblank(message = "邮箱格式错误"
  string email; //邮箱
  @length(min = 6, max = 12, message = "密码长度必须在6位到12位之间")
  string pwd;//密码
  //get、set.........
}

注意在校验邮箱的时候,当 email 为 "", 或者 null 的时候,会通过 @email验证,所以邮箱校验需要 @email和 @notblank 共同起作用。

controller 接口设计,在参数接受的地方添加 @validated 关键字

?
1
2
3
4
5
6
7
8
/**
  * 登录接口
  * @return
  */
 @postmapping("login")
 public string login(@validated @requestbody user user) {
   return "ok";
 }

访问测试:

当访问数据是如下格式的时候

?
1
2
3
4
5
6
{
 "name": "",
 "age": 0,
 "email": "",
 "pwd": ""
}

响应为:

?
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
{
 "timestamp": 1524640724522,
 "status": 400,
 "error": "bad request",
 "exception": "org.springframework.web.bind.methodargumentnotvalidexception",
 "errors": [
  {
   "codes": [
    "notblank.user.email",
    "notblank.email",
    "notblank.java.lang.string",
    "notblank"
   ],
   "arguments": [
    {
     "codes": [
      "user.email",
      "email"
     ],
     "arguments": null,
     "defaultmessage": "email",
     "code": "email"
    }
   ],
   "defaultmessage": "邮箱格式错误",
   "objectname": "user",
   "field": "email",
   "rejectedvalue": "",
   "bindingfailure": false,
   "code": "notblank"
  },
  {
   "codes": [
    "notblank.user.name",
    "notblank.name",
    "notblank.java.lang.string",
    "notblank"
   ],
   "arguments": [
    {
     "codes": [
      "user.name",
      "name"
     ],
     "arguments": null,
     "defaultmessage": "name",
     "code": "name"
    }
   ],
   "defaultmessage": "用户名不能为null,长度必须大于0",
   "objectname": "user",
   "field": "name",
   "rejectedvalue": "",
   "bindingfailure": false,
   "code": "notblank"
  },
  {
   "codes": [
    "length.user.pwd",
    "length.pwd",
    "length.java.lang.string",
    "length"
   ],
   "arguments": [
    {
     "codes": [
      "user.pwd",
      "pwd"
     ],
     "arguments": null,
     "defaultmessage": "pwd",
     "code": "pwd"
    },
    12,
    6
   ],
   "defaultmessage": "密码长度必须在6位到12位之间",
   "objectname": "user",
   "field": "pwd",
   "rejectedvalue": "",
   "bindingfailure": false,
   "code": "length"
  },
  {
   "codes": [
    "min.user.age",
    "min.age",
    "min.java.lang.integer",
    "min"
   ],
   "arguments": [
    {
     "codes": [
      "user.age",
      "age"
     ],
     "arguments": null,
     "defaultmessage": "age",
     "code": "age"
    },
    1
   ],
   "defaultmessage": "最小年龄为1岁",
   "objectname": "user",
   "field": "age",
   "rejectedvalue": 0,
   "bindingfailure": false,
   "code": "min"
  }
 ],
 "message": "validation failed for object='user'. error count: 4",
 "path": "/yiba/sms/login"
}

可以看到本地请求,4个字段校验都没通过,那么我有没有办法获取异常信息呢,答案是有的,需要我们修改 controller 接口。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
  * 登录接口
  *
  * @return
  */
 @postmapping("login")
 public string login(@validated @requestbody user user, bindingresult bindingresult) {
   if (bindingresult.haserrors()) {
     //有校验没通过
     list<objecterror> errorlist = bindingresult.getallerrors();
     for (objecterror error : errorlist) {
       system.out.println(error.getdefaultmessage()); //输出具体的错误信息
     }
     return "参数异常";
   }
   return "ok";
 }

再次请求,请求格式如下

?
1
2
3
4
5
6
{
 "name": "",
 "age": 0,
 "email": "",
 "pwd": ""
}

响应如下

参数异常

在控制台打印的信息如下:

用户名不能为null,长度必须大于0
密码长度必须在6位到12位之间
最小年龄为1岁
邮箱格式错误

可以看到我们已经正常的获取到了校验信息了。

下面我们来做一次参照正确的访问:

请求参数如下:

?
1
2
3
4
5
6
{
 "name": "zhaoyanjun",
 "age": 1,
 "email": "362299465@qq.com",
 "pwd": "123456"
}

响应如下:

ok

控制台什么也没输出。

总结

以上所述是小编给大家介绍的spring请求参数校验功能实例演示,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://www.cnblogs.com/zhaoyanjun/p/9007056.html