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=) 被注释的元素必须符合指定的正则表达式
HibernateValidator提供的校验注解:
@NotBlank(message=) 只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空,不能为null、"",可以为""
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
实例演示
创建需要被校验的实体类:
packagecom.yiba.wifi.news.bean.model;
importorg.hibernate.validator.constraints.Length;
importjavax.validation.constraints.*;
publicclassUser{
@NotBlank(message="用户名不能为null,长度必须大于0")
Stringname;//用户名
@Min(value=1,message="最小年龄为1岁")
@Max(value=120,message="最大年龄为120岁")
Integerage;//年龄
@Email(message="邮箱格式错误")
@NotBlank(message="邮箱格式错误")
Stringemail;//邮箱
@Length(min=6,max=12,message="密码长度必须在6位到12位之间")
Stringpwd;//密码
//get、set.........
}
注意在校验邮箱的时候,当email为"",或者null的时候,会通过@Email验证,所以邮箱校验需要@Email和@NotBlank共同起作用。
controller接口设计,在参数接受的地方添加@Validated关键字
/**
*登录接口
*@return
*/
@PostMapping("login")
publicStringlogin(@Validated@RequestBodyUseruser){
return"ok";
}
访问测试:
当访问数据是如下格式的时候
{
"name":"",
"age":0,
"email":"",
"pwd":""
}
响应为:
{
"timestamp":1524640724522,
"status":400,
"error":"BadRequest",
"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":"Validationfailedforobject='user'.Errorcount:4",
"path":"/yiba/sms/login"
}
可以看到本地请求,4个字段校验都没通过,那么我有没有办法获取异常信息呢,答案是有的,需要我们修改controller接口。
/**
*登录接口
*
*@return
*/
@PostMapping("login")
publicStringlogin(@Validated@RequestBodyUseruser,BindingResultbindingResult){
if(bindingResult.hasErrors()){
//有校验没通过
ListerrorList=bindingResult.getAllErrors();
for(ObjectErrorerror: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请求参数校验功能实例演示,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!