在平常的開發中,參數校驗是很是重要的一個環節,嚴格參數校驗會減小不少出bug的機率,增長接口的安全性。也會減小對接時沒必要要的溝通。好比說:在對接的時候前端動不動就甩個截圖過來講接口有問題,你檢查了半天發現前端傳遞的參數有問題。針對以上:今天給你們分享一下SpringBoot如何實現統一參數校驗。前端
使用 @Validated
註解配合參數校驗註解, 好比:@NotEmpty
對參數進行校驗。而後對拋出的異常ControllerAdvice
進行捕獲而後調整輸出數據。java
@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);
}
}
複製代碼
@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 不傳任何參數。git
這個時候SpringBoot已經根據校驗註解對參數進行校驗了。而且輸出了一大堆的錯誤信息。這個時候前端在對接的時候看到這樣的錯誤信息,反手就是給你截個圖告訴你接口有問題。因此這個時候就該使用 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輸出,若是不須要可使用@ControllerAdvicejson
以上代碼只返回了錯誤信息。能夠根據實際狀況進行調整。數組
這個時候的錯誤信息就比較友好了,很是明確的指出了缺乏參數。安全
註解 | 運行時檢查 |
---|---|
@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 | 對信用卡號進行一個大體的驗證 |
被註釋的元素必須是電子郵箱地址 | |
@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就能夠實現了。app
@Data
public class JsonRequestForm {
@Vaild
@Size(min = 1 ,max = 10 , message = "列表中的元素數量爲1~10")
private List<RequestForm> requestFormList;
}
複製代碼
https://gitee.com/huangxunhui/unifiedParamCheck.git 測試
若是以爲對你有幫助,能夠多多評論,多多點贊哦,也能夠到個人主頁看看,說不定有你喜歡的文章,也能夠隨手點個關注哦,謝謝。ui