当前位置: 首页 > news >正文

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 , 欢迎关注
weixin200.jpg

相关文章:

  • 十年之后大数据的价值主张
  • NetCore偶尔有用篇:NetCore项目添加MIME
  • amazeui学习笔记--css(常用组件15)--CSS动画Animation
  • 诺基亚推出 第一个“百岁级”路由器
  • 解决idea中maven拉不下jar包问题
  • MySQL---笔记之视图的使用详解
  • 大数据联合实验室落地成都青羊
  • 卷积神经网络(CNN)
  • 《循序渐进LINUX》笔记
  • 2030年5G有望带动经济产出6.3万亿
  • python 笔记 之 计算md5值
  • CCBN 2017:新华三融媒云展区上演“云”之旅!
  • windows系统中如何启动两个tomcat
  • 中国物联网在哪些方向具有无与伦比的发展优势?
  • 实现一个智能聊天机器人「图灵机器人,Java,recyclerView」
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【译】理解JavaScript:new 关键字
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • php的插入排序,通过双层for循环
  • Rancher如何对接Ceph-RBD块存储
  • supervisor 永不挂掉的进程 安装以及使用
  • VuePress 静态网站生成
  • Yii源码解读-服务定位器(Service Locator)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 免费小说阅读小程序
  • 前嗅ForeSpider中数据浏览界面介绍
  • 我的业余项目总结
  • 我与Jetbrains的这些年
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 消息队列系列二(IOT中消息队列的应用)
  • 源码安装memcached和php memcache扩展
  • 主流的CSS水平和垂直居中技术大全
  • 第二十章:异步和文件I/O.(二十三)
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # 透过事物看本质的能力怎么培养?
  • #if #elif #endif
  • $(selector).each()和$.each()的区别
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)jQuery 基础
  • . Flume面试题
  • .NET Core 项目指定SDK版本
  • .NET Micro Framework初体验
  • .Net mvc总结
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)