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

控制台什么也没输出。

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

个人微信号:zhaoyanjun125 , 欢迎关注

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwfyf.html