您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)SpringBoot中怎么處理校驗參數(shù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
什么是Validator
Bean Validation是Java定義的一套基于注解的數(shù)據(jù)校驗規(guī)范,目前已經(jīng)從JSR 303的1.0版本升級到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已經(jīng)經(jīng)歷了三個版本 。在SpringBoot中已經(jīng)集成在 starter-web中,所以無需在添加其他依賴。
注解介紹
validator內(nèi)置注解
注解
詳細信息
@Null
被注釋的元素必須為 null
@NotNull
被注釋的元素必須不為 null
@AssertTrue
被注釋的元素必須為 true
@AssertFalse
被注釋的元素必須為 false
@Min(value)
被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@Max(value)
被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@DecimalMin(value)
被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value)
被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Size(max, min)
被注釋的元素的大小必須在指定的范圍內(nèi)
@Digits (integer, fraction)
被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)
@Past
被注釋的元素必須是一個過去的日期
@Future
被注釋的元素必須是一個將來的日期
@Pattern(value)
被注釋的元素必須符合指定的正則表達式
Hibernate Validator 附加的 constraint
注解
詳細信息
被注釋的元素必須是電子郵箱地址
@Length
被注釋的字符串的大小必須在指定的范圍內(nèi)
@NotEmpty
被注釋的字符串的必須非空
@Range
被注釋的元素必須在合適的范圍內(nèi)
@NotBlank
驗證字符串非null,且長度必須大于0
注意:
@NotNull 適用于任何類型被注解的元素必須不能與NULL @NotEmpty 適用于String Map或者數(shù)組不能為Null且長度必須大于0 @NotBlank 只能用于String上面 不能為null,調(diào)用trim()后,長度必須大于0
使用
使用起來也非常簡單,下面略過創(chuàng)建項目
模擬用戶注冊封裝了一個UserDTO
當提交數(shù)據(jù)的時候如果使用以前的做法就是IF ELSE判斷參數(shù)使用validator則是需要增加注解即可。
例如非空校驗:
然后需要在controller方法體添加@Validated不加@Validated校驗會不起作用
然后請求一下請求接口,把Email參數(shù)設(shè)置為空
參數(shù):
{ "userName":"luomengsun", "mobileNo":"11111111111", "sex":1, "age":21, "email":""}
返回結(jié)果:
后臺拋出異常
這樣是能校驗成功,但是有個問題就是返回參數(shù)并不理想,前端也并不容易處理返回參數(shù),所以我們添加一下全局異常處理,然后添加一下全局統(tǒng)一返回參數(shù)這樣比較規(guī)范。
添加全局異常
創(chuàng)建一個GlobalExceptionHandler類,在類上方添加@RestControllerAdvice注解然后添加以下代碼:
/** * 方法參數(shù)校驗 */@ExceptionHandler(MethodArgumentNotValidException.class)public ReturnVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); return new ReturnVO().error(e.getBindingResult().getFieldError().getDefaultMessage()); }
此方法主要捕捉MethodArgumentNotValidException異常然后對異常結(jié)果進行封裝,如果需要在自行添加其他異常處理。
添加完之后我們在看一下運行結(jié)果,調(diào)用接口返回:
{ "code": "9999", "desc": "郵箱不能為空", "data": null}
OK 已經(jīng)對異常進行處理。
校驗格式
如果想要校驗郵箱格式或者手機號的話也非常簡單。
校驗郵箱
/** * 郵箱 */ @NotBlank(message = "郵箱不能為空") @NotNull(message = "郵箱不能為空") @Email(message = "郵箱格式錯誤") private String email;
使用正則校驗手機號
校驗手機號使用正則進行校驗,然后限制了一下位數(shù)
/** * 手機號 */ @NotNull(message = "手機號不能為空") @NotBlank(message = "手機號不能為空") @Pattern(regexp ="^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手機號格式有誤") @Max(value = 11,message = "手機號只能為{max}位") @Min(value = 11,message = "手機號只能為{min}位") private String mobileNo;
查看一下運行結(jié)果
傳入?yún)?shù):
{ "userName":"luomengsun", "mobileNo":"111111a", "sex":1, "age":21, "email":"1212121"}
返回結(jié)果:
{ "code": "9999", "desc": "郵箱格式錯誤", "data": null}
這里不再驗證手機號的例子
自定義注解
上面的注解只有這么多,如果有特殊校驗的參數(shù)我們可以使用Validator自定義注解進行校驗
首先創(chuàng)建一個IdCard注解類
@Documented@Target({ElementType.PARAMETER, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = IdCardValidator.class)public @interface IdCard { String message() default "身份證號碼不合法"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};}
在UserDTO中添加@IdCard注解即可驗證,在運行時觸發(fā),本文不對自定義注解做過多的解釋,下篇文章介紹自定義注解
message 提示信息 groups 分組 payload 針對于Bean
然后添加IdCardValidator 主要進行驗證邏輯
上面調(diào)用了is18ByteIdCardComplex方法,傳入?yún)?shù)就是手機號,驗證身份證規(guī)則自行百度
然后使用
@NotNull(message = "身份證號不能為空") @IdCard(message = "身份證不合法") private String IdCardNumber;
分組
就比如上面我們定義的UserDTO中的參數(shù)如果要服用的話怎么辦?
在重新定義一個類然后里面的參數(shù)要重新添加注解?
Validator提供了分組方法完美了解決DTO服用問題
現(xiàn)在我們注冊的接口修改一下規(guī)則,只有用戶名不能為空其他參數(shù)都不進行校驗
先創(chuàng)建分組的接口
public interface Create extends Default {}
我們只需要在注解加入分組參數(shù)即可例如:
/** * 用戶名 */ @NotBlank(message = "用戶姓名不能為空",groups = Create.class) @NotNull(message = "用戶姓名不能為空",groups = Create.class) private String userName; @NotBlank(message = "郵箱不能為空",groups = Update.class) @NotNull(message = "郵箱不能為空",groups = Update.class) @Email(message = "郵箱格式錯誤",groups = Update.class) private String email;
然后在修改Controller在@Validated中傳入Create.class
@PostMapping("/user") public ReturnVO userRegistra(@RequestBody @Validated(Create.class) UserDTO userDTO){ ReturnVO returnVO = userService.userRegistra(userDTO); return returnVO ; }
然后調(diào)用傳入?yún)?shù):
{ "userName":"",}
返回參數(shù):
{ "code": "9999", "desc": "用戶姓名不能為空", "data": null}
OK 現(xiàn)在只對Create的進行校驗,而Updata組的不校驗,如果需要復(fù)用DTO的話可以使用分組校驗
校驗單個參數(shù)
在開發(fā)的時候一定遇到過單個參數(shù)的情況,在參數(shù)前面加上注解即可
@PostMapping("/get") public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "用戶ID不能為空") String userId){ return new ReturnVO().success(); }
然后在Controller類上面增加@Validated注解,注意不是增加在參數(shù)前面。
上述就是小編為大家分享的SpringBoot中怎么處理校驗參數(shù)了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。