当前位置: 代码迷 >> 综合 >> Springmvc请求参数校验@Validated
  详细解决方案

Springmvc请求参数校验@Validated

热度:56   发布时间:2023-09-19 21:13:52.0

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

  /*** 登录接口** @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";}

再次请求,请求格式如下

{"name": "","age": 0,"email": "","pwd": ""
}

响应如下

参数异常

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

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

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

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

{"name": "zhaoyanjun","age": 1,"email": "362299465@qq.com","pwd": "123456"
}

响应如下:

ok

控制台什么也没输出。

到这里校验已经讲解完成了。

  相关解决方案