Spring請求參數校驗

SpringMVC支持的數據校驗是JSR303的標準,經過在bean的屬性上打上@NotNull@Max等進行驗證。JSR303提供有不少annotation接口,而SpringMVC對於這些驗證是使用hibernate的實現,因此咱們須要添加hibernate的一個validator包:java

依賴引用

compile 'javax.validation:validation-api:2.0.0.Final'
compile 'org.hibernate:hibernate-validator:6.0.0.Final'

框架已經提供校驗以下:git

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=)  被註釋的元素必須在合適的範圍內

實例演示

建立須要被校驗的實體類:web

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 關鍵字spring

/**
     * 登陸接口
     * @return
     */
    @PostMapping("login")
    public String login(@Validated @RequestBody User user) {
        return "ok";
    }

訪問測試:
當訪問數據是以下格式的時候api

{
  "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 接口。app

/**
     * 登陸接口
     *
     * @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 , 歡迎關注

相關文章
相關標籤/搜索