介紹
幾乎每個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
閱讀更多 Java識堂 的文章