關(guān)于Spring?Validation數(shù)據(jù)校檢的使用流程分析
Spring Validation
1 關(guān)于Spring Validation
在實(shí)際項(xiàng)目我們需要對(duì)客戶端傳遞到服務(wù)端的參數(shù)進(jìn)行校驗(yàn),用于判定請(qǐng)求參數(shù)的合法性,假如請(qǐng)求參數(shù)不合法則不可以再去執(zhí)行后續(xù)的業(yè)務(wù)了。那如何校驗(yàn)?zāi)兀?/p>
一種方式是我們?cè)诳刂茖臃椒ㄖ忻看味甲约哼M(jìn)行參數(shù)有效值的判斷,不合法可以拋出異常,但是工作量和代碼復(fù)雜度會(huì)比較高;
第二種方式就是采用市場(chǎng)上主流的 Spring Validation
框架去實(shí)現(xiàn)校驗(yàn),所以 Spring Validation
框架的主要作用是 檢查參數(shù)的基本有效性。
2 使用流程
在Spring Boot工程中,使用此框架需要添加依賴,并刷新maven
<!-- Spring Boot支持Spring Validation的依賴項(xiàng),用于檢查參數(shù)的基本有效性 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
3 快速入門
1.在處理請(qǐng)求的方法的參數(shù)列表中,在POJO類型的參數(shù)上添加@Validated
注解,表示需要通過Spring Validation框架檢查此參數(shù),例如UserController中注冊(cè)功能:
@ApiOperation(value = "注冊(cè)功能") @PostMapping("reg") public JsonResult reg(@RequestBody @Validated UserRegDTO userRegDTO){}
2.在此POJO類中的屬性上,添加對(duì)應(yīng)的檢查注解,以配置檢查規(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中測(cè)試,當(dāng)提交請(qǐng)求時(shí),如果username參數(shù)為 null
,服務(wù)器端將響應(yīng)400
錯(cuò)誤。
同時(shí)在終端也會(huì)出現(xiàn)異常
4 運(yùn)行異常處理
4.1 說明
在使用Spring Validation框架執(zhí)行參數(shù)的檢查時(shí),如果檢查不通過,除了響應(yīng)400
錯(cuò)誤以外,在控制臺(tái)還會(huì)拋出錯(cuò)誤: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, "請(qǐng)求參數(shù)錯(cuò)誤"); }
第2步:重啟工程,在Knife4j中測(cè)試
4.3 明確提示消息
當(dāng)提交的username
的值為 null 時(shí),可以發(fā)現(xiàn)異常已被處理!
但是,處理結(jié)果并不合適,因?yàn)?,客戶端得到此結(jié)果后,仍無法明確出現(xiàn)了什么錯(cuò)誤!
所有的檢查注解都可以配置message
參數(shù),用于對(duì)錯(cuò)誤進(jìn)行描述。
第1步:@NotNull
注解中添加 message
參數(shù)
@NotNull(message = "必須提交用戶名") private String username;
第2步:自定義枚舉狀態(tài)碼 StatusCode
VALIDATE_ERROR(3002, "參數(shù)校驗(yàn)失敗")
第3步:異常方法中獲取提示信息 message
在處理異常時(shí),需要調(diào)用MethodArgumentNotValidException
對(duì)象的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中測(cè)試
5 常用注解
5.1 @NotNull
注解
- 作用:用于驗(yàn)證對(duì)象是否為 null
- 用法:
@NotNull
注解用于對(duì)象類型上 - 示例
@NotNull(message = "用戶名不能為null") private String username;
5.2 @NotEmpty
注解
- 作用:用于驗(yàn)證字符串是否為空,并且會(huì)檢查是否為 null 值(為null值時(shí)報(bào)錯(cuò))
- 用法:用于字符串類型上
- 示例
@NotEmpty(message = "用戶名不能為空") private String username;
5.3 @NotBlank
注解
- 作用:不允許為空白,即不允許是“僅由空格、TAB等空白值組成的字符串”,也不允許為空字符串,也不允許為空值null
- 用法:用于字符串類型上
- 示例
@NotBlank(message = "用戶名不能為空白串") private String username;
5.4 @Size
注解
- 作用:可以指定最小值和最大值限制字符串的長(zhǎng)度
- 用法:用于字符串類型參數(shù)
- 示例
@Size(min = 6, max = 20, message = "用戶名長(zhǎng)度必須在6到20之間") private String username;
5.5 @Range
注解
- 作用:用于驗(yàn)證數(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 = "成績(jī)必須在0.1到1.0之間") private double score;
6 非POJO參數(shù)校驗(yàn)
在 Spring Validation 中,除了對(duì) POJO(Plain Old Java Object)進(jìn)行校驗(yàn)的功能外,還支持對(duì)非 POJO 進(jìn)行校驗(yàn),比如 String、Integer、Double 等類型的參數(shù)。
6.1 使用流程
在當(dāng)前方法所在的類上添加 @Validated
注解在參數(shù)上添加對(duì)應(yīng)的檢查注解
6.2 使用示例
對(duì)于 id 參數(shù)進(jìn)行范圍校驗(yàn),范圍只能在1-10之間
第1步:在類 WeiboController
中添加 @Validated
注解
@Validated public class WeiboController {}
第2步:在控制器方法參數(shù) id
上添加對(duì)應(yīng)的檢查注解
public JsonResult selectById(@Range(min = 1, max=10, message = "請(qǐng)?zhí)峤缓戏ǖ腎D值!") @RequestParam int id, String username)
第3步:重啟工程,在Knife4j或者瀏覽器中測(cè)試
到此這篇關(guān)于Spring Validation數(shù)據(jù)校檢的文章就介紹到這了,更多相關(guān)Spring Validation數(shù)據(jù)校檢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解用Eclipse如何創(chuàng)建Web項(xiàng)目
本篇文章主要介紹了詳解用Eclipse如何創(chuàng)建Web項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12IDEA集成git和使用步驟的實(shí)現(xiàn)方法
這篇文章主要介紹了IDEA集成git和使用步驟的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03通過openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過openOffice將office文件轉(zhuǎn)成pdf,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作
這篇文章主要介紹了自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java開發(fā)之spring security實(shí)現(xiàn)基于MongoDB的認(rèn)證功能
這篇文章主要介紹了Java開發(fā)之spring security實(shí)現(xiàn)基于MongoDB的認(rèn)證功能,結(jié)合實(shí)例形式分析了spring security在非JDBC環(huán)境下的自定義認(rèn)證服務(wù)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11詳解Java的Hibernate框架中的緩存與二級(jí)緩存
這篇文章主要介紹了Java的Hibernate框架中的緩存與二級(jí)緩存,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12Spring Boot2.0實(shí)現(xiàn)靜態(tài)資源版本控制詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0實(shí)現(xiàn)靜態(tài)資源版本控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11