• 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 , 欢迎关注

  • 相关阅读:
    机器学习十大算法之EM算法
    如何利用OpenSSL生成证书
    2018中国云原生用户大会:网易云爆料完整微服务的研发过程
    漫话中文分词
    10分钟快速构建汽车零售看板
    聊一聊整车厂的那些事——售后配件业务
    网易有数的“正确”使用方式——洞察数据中隐藏的故事
    深入浅出“跨视图粒度计算”--3、EXCLUDE表达式
    深入浅出“跨视图粒度计算”--2、INCLUDE表达式
    深入浅出“跨视图数据粒度计算”--1、理解数据的粒度
  • 原文地址:https://www.cnblogs.com/zhaoyanjun/p/9007056.html
Copyright © 2020-2023  润新知