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