Spring Boot 進行優(yōu)雅的字段校驗,寫得太好了!
點擊關(guān)注公眾號,Java干貨及時送達
作者:何甜甜在嗎
來源:juejin.cn/post/6913735652806754311
前段時間提交代碼審核,同事提了一個代碼規(guī)范缺陷:參數(shù)校驗應(yīng)該放在controller層。到底應(yīng)該如何做參數(shù)校驗?zāi)?/strong>
Controller層 VS Service層
去網(wǎng)上查閱了一些資料,一般推薦與業(yè)務(wù)無關(guān)的放在Controller層中進行校驗,而與業(yè)務(wù)有關(guān)的放在Service層中進行校驗。
那么如何將參數(shù)校驗寫的優(yōu)雅美觀呢,如果都是if - else,就感覺代碼寫的很low,還好有輪子可以使用
常用校驗工具類
使用Hibernate Validate
引入依賴
????org.hibernate
????hibernate-validator
????4.3.1.Final ?
常用注解說明

使用姿勢
Spring Boot 基礎(chǔ)就不介紹了,推薦下這個實戰(zhàn)教程:
https://github.com/javastacks/spring-boot-best-practice
需要搭配在Controller中搭配@Validated或@Valid注解一起使用,@Validated和@Valid注解區(qū)別不是很大,一般情況下任選一個即可,區(qū)別如下:

雖然@Validated比@Valid更加強大,在@Valid之上提供了分組功能和驗證排序功能,不過在實際項目中一直沒有用到過
Hibernate-validate框架中的注解是需要加在實體中一起使用的
public?class?DataSetSaveVO?{
????//唯一標識符為空
????@NotBlank(message?=?"user?uuid?is?empty")
????//用戶名稱只能是字母和數(shù)字
????@Pattern(regexp?=?"^[a-z0-9]+$",?message?=?"user?names?can?only?be?alphabetic?and?numeric")
????@Length(max?=?48,?message?=?"user?uuid?length?over?48?byte")
????private?String?userUuid;
????//數(shù)據(jù)集名稱只能是字母和數(shù)字
????@Pattern(regexp?=?"^[A-Za-z0-9]+$",?message?=?"data?set?names?can?only?be?letters?and?Numbers")
????//文件名稱過長
????@Length(max?=?48,?message?=?"file?name?too?long")
????//文件名稱為空
????@NotBlank(message?=?"file?name?is?empty")
????private?String?name;
????//數(shù)據(jù)集描述最多為256字節(jié)
????@Length(max?=?256,?message?=?"data?set?description?length?over?256?byte")
????//數(shù)據(jù)集描述為空
????@NotBlank(message?=?"data?set?description?is?null")
????private?String?description;
}
說明:message字段為不符合校驗規(guī)則時拋出的異常信息
@PostMapping
public?ResponseVO?createDataSet(@Valid?@RequestBody?DataSetSaveVO?dataSetVO)?{
????return?ResponseUtil.success(dataSetService.saveDataSet(dataSetVO));
}
說明:在校驗的實體DataSetSaveVO旁邊添加@Valid或@Validated注解。
使用commons-lang3
引入依賴
????org.apache.commons
????commons-lang3
????3.4
常用方法說明

測試代碼
//StringUtils.isEmpty
System.out.println(StringUtils.isEmpty(""));??//true
System.out.println(StringUtils.isEmpty("??"));??//false
//StringUtils.isNotEmpty
System.out.println(StringUtils.isNotEmpty(""));??//false
????????
//StringUtils.isBlank
System.out.println(StringUtils.isBlank(""));??//true
System.out.println(StringUtils.isBlank("?"));??//true
//StringUtils.isNotBlank
System.out.println(StringUtils.isNotBlank("?"));??//false
List?emptyList?=?new?ArrayList<>();
List?nullList?=?null;
List?notEmptyList?=?new?ArrayList<>();
notEmptyList.add(1);
//CollectionUtils.isEmpty
System.out.println(CollectionUtils.isEmpty(emptyList));???//true
System.out.println(CollectionUtils.isEmpty(nullList));???//true
System.out.println(CollectionUtils.isEmpty(notEmptyList));???//false
//CollectionUtils.isNotEmpty
System.out.println(CollectionUtils.isNotEmpty(emptyList));???//false
System.out.println(CollectionUtils.isNotEmpty(nullList));???//false
System.out.println(CollectionUtils.isNotEmpty(notEmptyList));???//true
自定義注解
當上面的方面都無法滿足校驗的需求以后,可以考慮使用自定義注解。另外,關(guān)注公眾號Java技術(shù)棧,在后臺回復(fù):面試,可以獲取我整理的 Java、Spring 系列面試題和答案,非常齊全。







關(guān)注Java技術(shù)棧看更多干貨


