SpringBoot實(shí)體多層嵌套判空字段的方式
前言
最近在公司了接了個需求;需要開發(fā)一個中間系統(tǒng);進(jìn)行三方聯(lián)調(diào);有接口開發(fā)經(jīng)驗(yàn)的朋友都知道;參數(shù)校驗(yàn)是必備的一項(xiàng)操作;怎么優(yōu)雅的校驗(yàn)卻是個問題;
我翻找了網(wǎng)絡(luò)上的一些校驗(yàn)方式;都比較參差不齊;多層嵌套下的判空校驗(yàn)寫的也莫名其妙;不是很爽;所以這是寫這篇文章的目的。
代碼部分會把GitHub或者gitee鏈接貼出來。正文部分只貼核心出裝。
涉及的知識點(diǎn)簡單列一下;不需要的朋友可以關(guān)閉文章。
- 單層實(shí)體字段的判空方式
- 實(shí)體嵌套字段的判空方式
@NotEmpty、@Valid、@NotBlank、@NotNull
注解介紹和使用場景- 代碼地址: https://gitee.com/xbhog/screw-demo.git
正文
單層實(shí)體判空方式
構(gòu)建springboot項(xiàng)目等基礎(chǔ)設(shè)置就不說了;
先來引包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
流程非常簡單;
- 新建實(shí)體類;寫兩個字段;使用
@NotBlank
注解修飾在某個字段上就可以進(jìn)行判空操作了。 - 新建接口;接收User實(shí)體進(jìn)行映射即可;需要注意的是接口實(shí)體前面需要有
@Valid
注解修飾對象才校驗(yàn)的住 - 字段校驗(yàn)失敗的返回信息獲?。?code>BindingResult bindingResult
@GetMapping("/save_user") public String saveUser(@Valid User u, BindingResult bindingResult) { if(bindingResult.hasErrors()){ // 獲取校驗(yàn)不通過字段的提示信息 List<FieldError> fieldErrors = bindingResult.getFieldErrors(); return JSON.toJSONString(fieldErrors); } return "user will save: name=" + u.getName() + ", age=" + u.getAge(); } // --------------------- @GetMapping("/save_user") public String saveUser(@Valid User u, BindingResult bindingResult) { if(bindingResult.hasErrors()){ // 獲取校驗(yàn)不通過字段的提示信息 List<FieldError> fieldErrors = bindingResult.getFieldErrors(); // 創(chuàng)建一個 List 來存儲每條錯誤信息 List<String> errorMessages = new ArrayList<>(); // 遍歷 FieldError 列表 for (FieldError fieldError : fieldErrors) { // 獲取 field 和 defaultMessage String field = fieldError.getField(); String defaultMessage = fieldError.getDefaultMessage(); // 拼接成一條完整的錯誤信息 String errorMessage = "字段位置 '" + field + "' " + defaultMessage; // 添加到 errorMessages 列表中 errorMessages.add(errorMessage); } // 如果需要將所有錯誤信息合并成一個字符串 return String.join("; ", errorMessages); } return "user will save: name=" + u.getName() + ", age=" + u.getAge(); }
看到這里;有朋友應(yīng)該反應(yīng)過來是不是可以對JSON進(jìn)行一些微操?只返回我們需要的格式。 字段位置 'name' 用戶名不能為空
[ { "arguments": [ { "code": "name", "codes": [ "user.name", "name" ], "defaultMessage": "name" } ], "bindingFailure": false, "code": "NotBlank", "codes": [ "NotBlank.user.name", "NotBlank.name", "NotBlank.java.lang.String", "NotBlank" ], "defaultMessage": "用戶名不能為空", "field": "name", "objectName": "user", "rejectedValue": "" } ]
實(shí)體嵌套判空方式
接口請求格式;其中包含List嵌套、實(shí)體嵌套等。
{ "empNo": "empNo_a9f8f3b460d9", "empName": "empName_7a907030695b", "job": "job_a518f90c4ea3", "dept": [ { "deptNo": "deptNo_3bcb556444f4", "deptName": "deptName_9ccf2be206d3", "users": [ { "name": "name_c387b61bc96f", "age": 0 } ] } ], "test": { "test1": "test1_4f553816ae20", "test2": "test2_89b1507abe90" } }
來看使用:@Valid、@NotEmpty、@NotNull
通過這三者的匹配就可以完成List以及實(shí)體的校驗(yàn)了。
@Data public class Emp { @NotBlank(message = "員工編號不能為空") private String empNo; @NotBlank(message = "員工姓名不能為空") private String empName; @NotBlank(message = "員工職位不能為空") private String job; @Valid @NotEmpty(message = "部門列表不能為空") private List<Dept> dept; @NotNull private Test test; } ------------------------------- @Data public class Dept { @NotBlank(message = "部門編號不能為空") private String deptNo; @NotBlank(message = "部門名稱不能為空") private String deptName; @Valid @NotEmpty(message = "部門中的用戶列表不能為空") private List<User> users; } -------------------------------- @Data public class User { @NotBlank(message = "用戶名不能為空") private String name; private Integer age; }
接口請求的方式同單層實(shí)例一樣;響應(yīng)結(jié)果:可以完全定位到某個List下的某個實(shí)體中的某個字段
字段位置 'dept[0].deptName' 部門名稱不能為空; 字段位置 'empName' 員工姓名不能為空; 字段位置 'dept[0].users[0].name' 用戶名不能為空; 字段位置 'dept[0].deptNo' 部門編號不能為空; 字段位置 'empNo' 員工編號不能為空; 字段位置 'job' 員工職位不能為空
注解說明
@NotEmpty
:這個注解檢查字符串(String)是否為空(""),或者集合(Collection)、地圖(Map)是否為空或者為null。它不會檢查字符串中的空白字符。@Valid
:這是一個遞歸驗(yàn)證注解,意味著它會深入到對象的屬性中去驗(yàn)證那些也是復(fù)雜對象的屬性。當(dāng)你希望驗(yàn)證一個對象的所有屬性都符合定義好的約束時,可以使用@Valid
。
- 當(dāng)使用
@Valid
校驗(yàn)時,要小心避免循環(huán)引用的情況,即對象之間相互校驗(yàn)可能導(dǎo)致無限遞歸
- 當(dāng)使用
@NotBlank
:此注解專門用來驗(yàn)證字符串(String),它檢查字符串是否為null,長度是否為零,或者是否只包含空白字符。如果字符串包含至少一個非空白字符,則認(rèn)為是有效的。@NotNull
:這個注解用來驗(yàn)證一個字段或者屬性是否為null。它并不關(guān)心字符串中的內(nèi)容,只要對象不是null即可。
總結(jié)
上述使用到的注解只是一點(diǎn)點(diǎn);像正則注解、身份證號、手機(jī)號、數(shù)字注解等都是有的;特殊需求特殊處理;對于判空的操作;這些注解已經(jīng)完全夠用了。
以上就是SpringBoot實(shí)體多層嵌套判空字段的方式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot多層嵌套判空字段的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用curator實(shí)現(xiàn)zookeeper鎖服務(wù)的示例分享
這篇文章主要介紹了使用curator實(shí)現(xiàn)zookeeper鎖服務(wù)的示例,需要的朋友可以參考下2014-02-02SpringBoot手動開啟事務(wù):DataSourceTransactionManager問題
這篇文章主要介紹了SpringBoot手動開啟事務(wù):DataSourceTransactionManager問題,具有很好的價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07idea項(xiàng)目的左側(cè)目錄沒了如何設(shè)置
這篇文章主要介紹了idea項(xiàng)目的左側(cè)目錄沒了如何設(shè)置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java利用 Exchanger 實(shí)現(xiàn)游戲中交換裝備
JDK 1.5 開始 JUC 包下提供的 Exchanger 類可用于兩個線程之間交換信息。下面我們就來看看Java是如何利用Exchanger一行代碼實(shí)現(xiàn)游戲中交換裝備的2021-09-09詳解如何在springcloud分布式系統(tǒng)中實(shí)現(xiàn)分布式鎖
最近在看分布式鎖的資料,本文就介紹一下利用springcloud結(jié)合redis實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11