大數據

SpringBoot統一參數校驗

前言

  在日常的開發中,參數校驗是非常重要的一個環節,嚴格參數校驗會減少很多出bug的概率,增加接口的安全性。也會減少對接時不必要的溝通。比如說:在對接的時候前端動不動就甩個截圖過來說接口有問題,你檢查了半天發現前端傳遞的參數有問題。針對以上:今天給大家分享一下SpringBoot如何實現統一參數校驗。

實現方式

  使用 @Validated註解配合參數校驗註解, 比如:@NotEmpty對參數進行校驗。然後對拋出的異常ControllerAdvice進行捕獲然後調整輸出數據。

TestController

@RestController
public class TestController {

    /**
     * 表單請求
     * @param form 請求參數
     * @return 響應數據
     */
    @PostMapping("/formRequest")
    public ResultVo formRequest(@Validated RequestForm form){
        return ResultVoUtil.success(form);
    }

    /**
     * JSON請求
     * @param form 請求參數
     * @return 響應數據
     */
    @PostMapping("/jsonRequest")
    public ResultVo jsonRequest(@RequestBody @Validated RequestForm form){
        return ResultVoUtil.success(form);
    }

}

RequestForm

@Data
public class RequestForm {

    @NotEmpty(message = "姓名不能為空")
    private String name;

    @Min(value = 1 , message = "年齡不能小於1歲")
    private Integer age;

    @NotEmpty(message = "性別不能為空")
    private Integer sex;

}

測試結果

請求:http://localhost:8080/formRequest 不傳任何參數。

  這個時候SpringBoot已經根據校驗註解對參數進行校驗了。並且輸出了一大堆的錯誤信息。這個時候前端在對接的時候看到這樣的錯誤信息,反手就是給你截個圖告訴你接口有問題。所以這個時候就該使用 ControllerAdvice規範異常返回信息了。

image

ControllerAdvice

@Slf4j
@RestControllerAdvice
public class ControllerAdvice {

    /**
     * 攔截表單參數校驗
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler({BindException.class})
    public ResultVo bindException(BindException e) {
        BindingResult bindingResult = e.getBindingResult();
        return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
    }
    
    /**
     * 攔截JSON參數校驗
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultVo bindException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
    }

}

@RestControllerAdvice會將返回的數據以json輸出,如果不需要可以使用@ControllerAdvice

以上代碼只返回了錯誤信息。可以根據實際情況進行調整。

image

這個時候的錯誤信息就比較友好了,非常明確的指出了缺少參數。

常用校驗註解

註解 運行時檢查
@AssertFalse 被註解的元素必須為false
@AssertTrue 被註解的元素必須為true
@DecimalMax(value) 被註解的元素必須為一個數字,其值必須小於等於指定的最小值
@DecimalMin(Value) 被註解的元素必須為一個數字,其值必須大於等於指定的最小值
@Digits(integer=, fraction=) 被註解的元素必須為一個數字,其值必須在可接受的範圍內
@Future 被註解的元素必須是日期,檢查給定的日期是否比現在晚
@Max(value) 被註解的元素必須為一個數字,其值必須小於等於指定的最小值
@Min(value) 被註解的元素必須為一個數字,其值必須大於等於指定的最小值
@NotNull 被註解的元素必須不為null
@Null 被註解的元素必須為null
@Past(java.util.Date/Calendar) 被註解的元素必須過去的日期,檢查標註對象中的值表示的日期比當前早
@Pattern(regex=, flag=) 被註解的元素必須符合正則表達式,檢查該字符串是否能夠在match指定的情況下被regex定義的正則表達式匹配
@Size(min=, max=) 被註解的元素必須在制定的範圍(數據類型:String, Collection, Map and arrays)
@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組, 那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗
@CreditCardNumber 對信用卡號進行一個大致的驗證
@Email 被註釋的元素必須是電子郵箱地址
@Length(min=, max=) 被註解的對象必須是字符串的大小必須在制定的範圍內
@NotBlank 被註解的對象必須為字符串,不能為空,檢查時會將空格忽略
@NotEmpty 被註釋的對象必須為空(數據:String,Collection,Map,arrays)
@Range(min=, max=) 被註釋的元素必須在合適的範圍內 (數據:BigDecimal, BigInteger, String, byte, short, int, long and 原始類型的包裝類 )
@URL(protocol=, host=, port=, regexp=, flags=) 被註解的對象必須是字符串,檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件

案例

@Data
public class ExampleForm {

    @NotEmpty(message = "姓名不能為空")
    @Length(min = 1 , max = 10 , message = "名字長度1~10")
    private String name;

    @Range(min = 1 , max = 99 , message = "年齡範圍在1~99歲")
    private Integer age;

    @Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$" , message = "電話號碼有誤")
    private String phone;

    @Email(message = "郵箱格式有誤")
    private String email;

    @Valid
    @Size(min = 1 ,max =  10 , message = "列表中的元素數量為1~10")
    private List<RequestForm> requestFormList;

    @Future(message = "開始時間必須大於當前時間")
    private Date beginTime;
    
}

實現嵌套驗證

  在實際的開發中,前臺會後臺傳遞一個list,我們不僅要限制每次請求list內的個數,同時還要對list內基本元素的屬性值進行校驗。這個時候就需要進行嵌套驗證了,實現的方式很簡單。在list上添加@Vaild就可以實現了。

@Data
public class JsonRequestForm {
    
    @Vaild
    @Size(min = 1 ,max =  10 , message = "列表中的元素數量為1~10")
    private List<RequestForm> requestFormList;
    
}

代碼地址

https://gitee.com/huangxunhui/unifiedParamCheck.git

結尾

  如果覺得對你有幫助,可以多多評論,多多點贊哦,也可以到我的主頁看看,說不定有你喜歡的文章,也可以隨手點個關注哦,謝謝。

  我是不一樣的科技宅,每天進步一點點,體驗不一樣的生活。我們下期見!

Leave a Reply

Your email address will not be published. Required fields are marked *