首页 > 开发 > Java > 正文

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

2024-07-14 08:40:43
字体:
来源:转载
供稿:网友

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

控制台什么也没输出。

总结

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


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表