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

时间:2021-05-02

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章