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

控制台什么也没输出。

总结

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

(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

  • AngularJs表单校验功能实例代码

    废话不多说了,具体代码如下所示: <!DOCTYPE html> <html ng-app="angularFormCheckModule"> <head> <meta charset="UTF-8"> <title>angular表单校验</title> <link rel="stylesheet" href="../css/bootstrap.min.cs

  • Angular+Bootstrap+Spring Boot实现分页功能实例代码

    需要用到的js angular.js(用angular.min.js会导致分页控件不显示) ui-bootstrap-tpls.min.js angular-animate.js 需要用到的css bootstrap.min.css 由于本项目使用了路由,所以讲js以及css文件的应用都放在一个主html,请同学们在html页面中添加以上文件 在开始之前,我先简单介绍下分页的原理. 分页的实质其实就是一条sql语句, 比如查找第二页,即第16到第30条数据 在MySQL中是select * fr

  • Spring boot的上传图片功能实例详解

    简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提

  • laravel请求参数校验方法

    对于后端开发而言,前端request请求中的参数校验是一个必不可少的环节.无论传来的参数是id还是email还是其他的参数,我们都要对参数的类型.大小.格式等等做这样或者那样的校验,然后才进行逻辑处理,以确保逻辑处理时万无一失,不会出现异样.于是乎,在controller层中就会出现一大坨的校验代码,这些校验代码甚至有时候都超过了正常的逻辑代码的数量,对于程序的扩展和维护很不利的. 但是,laravel为我们提供了一个很好的服务去解决参数校验这个问题,它就是----Validate. 首先,我们

  • Spring Boot参数校验及分组校验的使用教程

    目录 一  前言 1  什么是validator 二  注解介绍 1  validator内置注解 三  使用 1  单参数校验 2  对象参数校验 3  错误消息的捕获 总结 一  前言 做web开发有一点很烦人就是要对前端输入参数进行校验,基本上每个接口都要对参数进行校验,比如一些非空校验.格式校验等.如果参数比较少的话还是容易处理的一但参数比较多了的话代码中就会出现大量的if-else语句. 使用这种方式虽然简单直接,但是也有不好的地方,一是降低了开发效率,因为我们需要校验的参数会存在很多

  • java自定义注解实现前后台参数校验的实例

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 对这个感兴趣的,请好好看,好好学: package sonn.sonnannotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.anno

  • SpringBoot 如何自定义请求参数校验

    目录 一.Bean Validation基本概念 二.基本用法 三.自定义校验 3.1 自定义注解 3.2 自定义Validator 3.3 以编程的方式校验(手动) 3.4 定义分组校验 3.5 定制返回码和消息 3.6 更加细致的返回码和消息 四.小结 最近在工作中遇到写一些API,这些API的请求参数非常多,嵌套也非常复杂,如果参数的校验代码全部都手动去实现,写起来真的非常痛苦. 正好Spring轮子里面有一个Validation,这里记录一下怎么使用,以及怎么自定义它的返回结果. 一.B

  • SpringBoot各种参数校验的实例教程

    目录 简单使用 引入依赖 requestBody参数校验 requestParam/PathVariable参数校验 统一异常处理 进阶使用 分组校验 嵌套校验 集合校验 自定义校验 编程式校验 快速失败(Fail Fast) @Valid和@Validated区别 实现原理 requestBody参数校验实现原理 方法级别的参数校验实现原理 总结 简单使用 Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现.hibernate valida

  • Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

    前言 工作中发现一个定律,如果总是习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好我的业务代码,返回正确的结果即可.直到遇到了400. spring返回400的时候通常没有任何错误提示,当然也通常是参数不匹配.这在参数少的情况下还可以一眼看穿,但当参数很大是,排除参数也很麻烦,更何况,既然错误了,为什么指出来原因呢.好吧,springmvc把这个权力交给了用户自己.话不多说了,来一起看看详细的介绍吧. springmvc

随机推荐