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

网友投稿 248 2023-02-05


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

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

依赖引用

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=)  被注释的元素必须在合适的范围内

实例演示

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

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 关键字

/**

* 登录接口

* @return

*/

@PostMapping("login")

public String login(@Validated @RequestBody User user) {

return "ok";

}

访问测试:

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

{

"name": "",

"age": 0,

"email": "",

"pwd": ""

}

响应为:

{

"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": [

ftgnEF "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",

http:// "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 接口。

/**

* 登录接口

*

* @return

*/

@PostMapping("login")

public String login(@Validated @RequestBody User user, BindingResult bindingResult) {

if (bindingResult.hasErrors()) {

//有校验没通过

List errorList = bindingResult.getAllErrors();

for (ObjectError error : errorList) {

System.out.println(error.getDefaultMessage()); //输出具体的错误信息

}

return "参数异常";

}

return "ok";

}

再次请求,请求格式如下

{

"name": "",

"age": 0,

"email": "",

"pwd": ""

}

响应如下

参数异常

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

用户名不能为null,长度必须大于0

密码长度必须在6位到12位之间

最小年龄为1岁

邮箱格式错误

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

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

请求参数如下:

{

"name": "zhaoyanjun",

"age": 1,

"email": "362299465@qq.com",

"pwd": "123456"

}

响应如下:

ok

控制台什么也没输出。

总结

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:机顶盒连接共享文件夹(机顶盒连接共享文件夹怎么设置)
下一篇:详解Vue 多级组件透传新方法provide/inject
相关文章

 发表评论

暂时没有评论,来抢沙发吧~