關(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注解,表示需要通過(guò)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 = "螢火蟲(chóng)")
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 說(shuō)明
在使用Spring Validation框架執(zhí)行參數(shù)的檢查時(shí),如果檢查不通過(guò),除了響應(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 處理異常
使用全局異常處理器來(lái)處理 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é)果后,仍無(wú)法明確出現(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ù)字類型字段的取值范圍,通過(guò)配置min和max屬性來(lái)限制數(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)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
IDEA集成git和使用步驟的實(shí)現(xiàn)方法
這篇文章主要介紹了IDEA集成git和使用步驟的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
通過(guò)openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過(guò)openOffice將office文件轉(zhuǎn)成pdf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作
這篇文章主要介紹了自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java開(kāi)發(fā)之spring security實(shí)現(xiàn)基于MongoDB的認(rèn)證功能
這篇文章主要介紹了Java開(kāi)發(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開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12
Spring Boot2.0實(shí)現(xiàn)靜態(tài)資源版本控制詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0實(shí)現(xiàn)靜態(tài)資源版本控制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11

