關于Spring?Validation數(shù)據(jù)校檢的使用流程分析
Spring Validation
1 關于Spring Validation
在實際項目我們需要對客戶端傳遞到服務端的參數(shù)進行校驗,用于判定請求參數(shù)的合法性,假如請求參數(shù)不合法則不可以再去執(zhí)行后續(xù)的業(yè)務了。那如何校驗呢?
一種方式是我們在控制層方法中每次都自己進行參數(shù)有效值的判斷,不合法可以拋出異常,但是工作量和代碼復雜度會比較高;
第二種方式就是采用市場上主流的 Spring Validation
框架去實現(xiàn)校驗,所以 Spring Validation
框架的主要作用是 檢查參數(shù)的基本有效性。
2 使用流程
在Spring Boot工程中,使用此框架需要添加依賴,并刷新maven
<!-- Spring Boot支持Spring Validation的依賴項,用于檢查參數(shù)的基本有效性 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
3 快速入門
1.在處理請求的方法的參數(shù)列表中,在POJO類型的參數(shù)上添加@Validated
注解,表示需要通過Spring Validation框架檢查此參數(shù),例如UserController中注冊功能:
@ApiOperation(value = "注冊功能") @PostMapping("reg") public JsonResult reg(@RequestBody @Validated UserRegDTO userRegDTO){}
2.在此POJO類中的屬性上,添加對應的檢查注解,以配置檢查規(guī)則,
例如,添加@NotNull
注解,就表示“不允許為null
”的規(guī)則!
在UserRegDTO
類
@Data public class UserRegDTO { @NotNull @ApiModelProperty(value = "用戶名", required = true, example = "趙麗穎") private String username; @ApiModelProperty(value = "密碼", required = true, example = "123456") private String password; @ApiModelProperty(value = "昵稱", required = true, example = "螢火蟲") private String nickname; }
重啟工程,在Knife4j中測試,當提交請求時,如果username參數(shù)為 null
,服務器端將響應400
錯誤。
同時在終端也會出現(xiàn)異常
4 運行異常處理
4.1 說明
在使用Spring Validation框架執(zhí)行參數(shù)的檢查時,如果檢查不通過,除了響應400
錯誤以外,在控制臺還會拋出錯誤:MethodArgumentNotValidException
使用全局異常處理器解決。
[org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public cn.tedu._043mvcweibo.common.response.JsonResult cn.tedu._043mvcweibo.controller.UserController.reg(cn.tedu._043mvcweibo.pojo.dto.UserRegDTO): [Field error in object 'userRegDTO' on field 'username': rejected value [null]; codes [NotNull.userRegDTO.username,NotNull.username,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userRegDTO.username,username]; arguments []; default message [username]]; default message [不能為null]] ]
4.2 處理異常
使用全局異常處理器來處理 MethodArgumentNotValidException
異常
第1步:全局異常處理器 GlobalExceptionHandler
中定義處理異常方法
@ExceptionHandler public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException ex){ return new JsonResult(3002, "請求參數(shù)錯誤"); }
第2步:重啟工程,在Knife4j中測試
4.3 明確提示消息
當提交的username
的值為 null 時,可以發(fā)現(xiàn)異常已被處理!
但是,處理結(jié)果并不合適,因為,客戶端得到此結(jié)果后,仍無法明確出現(xiàn)了什么錯誤!
所有的檢查注解都可以配置message
參數(shù),用于對錯誤進行描述。
第1步:@NotNull
注解中添加 message
參數(shù)
@NotNull(message = "必須提交用戶名") private String username;
第2步:自定義枚舉狀態(tài)碼 StatusCode
VALIDATE_ERROR(3002, "參數(shù)校驗失敗")
第3步:異常方法中獲取提示信息 message
在處理異常時,需要調(diào)用MethodArgumentNotValidException
對象的getFieldError().getDefaultMessage()
獲取以上配置的描述文本
@ExceptionHandler public JsonResult handleBindException(MethodArgumentNotValidException ex){ /* ex.getFieldError().getDefaultMessage():獲取 @NotNull(message="xxx") 中message的消息 */ String message = ex.getFieldError().getDefaultMessage(); return new JsonResult(StatusCode.VALIDATE_ERROR, message); }
第4步:重啟工程,在Knife4j中測試
5 常用注解
5.1 @NotNull
注解
- 作用:用于驗證對象是否為 null
- 用法:
@NotNull
注解用于對象類型上 - 示例
@NotNull(message = "用戶名不能為null") private String username;
5.2 @NotEmpty
注解
- 作用:用于驗證字符串是否為空,并且會檢查是否為 null 值(為null值時報錯)
- 用法:用于字符串類型上
- 示例
@NotEmpty(message = "用戶名不能為空") private String username;
5.3 @NotBlank
注解
- 作用:不允許為空白,即不允許是“僅由空格、TAB等空白值組成的字符串”,也不允許為空字符串,也不允許為空值null
- 用法:用于字符串類型上
- 示例
@NotBlank(message = "用戶名不能為空白串") private String username;
5.4 @Size
注解
- 作用:可以指定最小值和最大值限制字符串的長度
- 用法:用于字符串類型參數(shù)
- 示例
@Size(min = 6, max = 20, message = "用戶名長度必須在6到20之間") private String username;
5.5 @Range
注解
- 作用:用于驗證數(shù)字類型字段的取值范圍,通過配置min和max屬性來限制數(shù)值類型參數(shù)的值區(qū)間包括最小值和最大值
- 用法:用于數(shù)值類型參數(shù)
- 示例
@Range(min = 1, max = 10, message = "年齡必須在1-10歲之間") private int age; @Range(min = 0.1, max = 1.0, message = "成績必須在0.1到1.0之間") private double score;
6 非POJO參數(shù)校驗
在 Spring Validation 中,除了對 POJO(Plain Old Java Object)進行校驗的功能外,還支持對非 POJO 進行校驗,比如 String、Integer、Double 等類型的參數(shù)。
6.1 使用流程
在當前方法所在的類上添加 @Validated
注解在參數(shù)上添加對應的檢查注解
6.2 使用示例
對于 id 參數(shù)進行范圍校驗,范圍只能在1-10之間
第1步:在類 WeiboController
中添加 @Validated
注解
@Validated public class WeiboController {}
第2步:在控制器方法參數(shù) id
上添加對應的檢查注解
public JsonResult selectById(@Range(min = 1, max=10, message = "請?zhí)峤缓戏ǖ腎D值!") @RequestParam int id, String username)
第3步:重啟工程,在Knife4j或者瀏覽器中測試
到此這篇關于Spring Validation數(shù)據(jù)校檢的文章就介紹到這了,更多相關Spring Validation數(shù)據(jù)校檢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
通過openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過openOffice將office文件轉(zhuǎn)成pdf,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作
這篇文章主要介紹了自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java開發(fā)之spring security實現(xiàn)基于MongoDB的認證功能
這篇文章主要介紹了Java開發(fā)之spring security實現(xiàn)基于MongoDB的認證功能,結(jié)合實例形式分析了spring security在非JDBC環(huán)境下的自定義認證服務實現(xiàn)技巧,需要的朋友可以參考下2017-11-11Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解
這篇文章主要給大家介紹了關于Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11