幫你少寫一大半參數校驗代碼的小技巧

幫你少寫一大半參數校驗代碼的小技巧

介紹

幾乎每個web網站都會對用戶提交的參數進行校驗,前端要做,後端也要做。防止用戶直接通過接口調用的方式來請求或保存數據,從而導致產生髒數據等其他嚴重的後果。

因為有些校驗的邏輯也很繁瑣,為了減輕開發者的負擔,Java發佈了 JSR303/JSR-349數據校驗規範

JSR303 是一項標準,JSR-349 是其的升級版本,添加了一些新特性,他們規定一些校驗規範即校驗註解,如 @Null,@NotNull,@Pattern,他們位於 javax.validation.constraints 包下,只提供規範不提供實現。而 hibernate validation 是對這個規範的實踐(不要將 hibernate 和數據庫 orm 框架聯繫在一起),他提供了相應的實現,並增加了一些其他校驗註解,如 @Length,@Range 等等,他們位於 org.hibernate.validator.constraints 包下。而萬能的 spring 為了給開發者提供便捷,對 hibernate validation 進行了二次封裝,顯示校驗 validated bean 時,你可以使用 spring validation 或者 hibernate validation,而 spring validation 另一個特性,便是其在 springmvc 模塊中添加了自動校驗,並將校驗信息封裝進了特定的類中。這無疑便捷了我們的 web 開發

在spring boot項目中只要加入如下依賴即可使用校驗註解

幫你少寫一大半參數校驗代碼的小技巧

查看子依賴會發現有如下依賴

幫你少寫一大半參數校驗代碼的小技巧

JSR提供的部分校驗註解如下

幫你少寫一大半參數校驗代碼的小技巧

經常被搞混的3個註解

幫你少寫一大半參數校驗代碼的小技巧

我來舉一個org.apache.commons.lang3.StringUtils中的例子,你就能理解NotBlank的意思了,如下斷言都能測試通過

幫你少寫一大半參數校驗代碼的小技巧

改造一個註冊的接口

先定義一下狀態枚舉類

幫你少寫一大半參數校驗代碼的小技巧

定義項目的返回對象

幫你少寫一大半參數校驗代碼的小技巧

註冊接口,這裡省略了一部分校驗

幫你少寫一大半參數校驗代碼的小技巧

當不滿足條件時返回如下

{
"status": 2,
"msg": "用戶名不能為空"
}

當參數較多,校驗的邏輯也越來越多,這時可以直接將前端傳過來參數直接轉為對象

幫你少寫一大半參數校驗代碼的小技巧

幫你少寫一大半參數校驗代碼的小技巧

代碼將不滿足條件的字段的描述取一個出來返回,類似如下。當都滿足時才會返回成功

{
"status": 2,
"msg": "用戶名不能為空"
}

需要注意的地方如下

參數 Student 前需要加上@Valid或@Validated 註解(下文說這2個註解的區別),表明需要 spring 對其進行校驗,而校驗的信息會存放到其後的 BindingResult 中。注意,必須相鄰,如果有多個參數需要校驗,形式可以如下。foo(@Validated Student student, BindingResult studentBindingResult ,@Validated Bar bar, BindingResult barBindingResult); 即一個校驗類對應一個校驗結果。

@Validated比@Valid的功能更強大

@Validated比@Valid的功能更強大,主要體現在@Validated可以進行分組校驗和嵌套校驗。

如果同一個類,在不同的使用場景下有不同的校驗規則,那麼可以使用分組校驗,用處不多,不再介紹。介紹一下嵌套校驗

假如我們還要求學生填寫父親和母親的名字(並且不能為空),而後端的設計中父親和母親的名字被放在另一個類Relation中,這就要求我們能進行嵌套校驗。

我們要做如下2個事情

1.將方法中的@Valid註解改為@Validated

2.在relation屬性上加@Valid註解

幫你少寫一大半參數校驗代碼的小技巧

幫你少寫一大半參數校驗代碼的小技巧

那Relation類的fatherName屬性如何被賦值呢?

很簡單,前端傳入的參數名是如下即可

xxxx?relation.fatherName=li&relation.motherName=liu

原文鏈接:https://blog.csdn.net/zzti_erlie/article/details/102624957


分享到:


相關文章: