數據的校驗是做web開發不可或缺的部分,前端的js校驗可以涵蓋大部分的校驗職責,如用戶名唯一性,生日格式,郵箱格式校驗等等常用的校驗。但是為了避免用戶繞過瀏覽器,使用http工具直接向后端請求一些違法數據,服務端的數據校驗也是必要的。這樣避免了臟數據落到數據庫中也避免了一些無效的操作。
1.JSR303/JSR-349,hibernate validation,spring validation之間的關系:
JSR303是一項標准,JSR-349是其的升級版本,添加了一些新特性,他們規定一些校驗規范即校驗注解,如@Null,@NotNull,@Pattern,他們位於javax.validation.constraints包下,只提供規范不提供實現。而hibernate validation是對這個規范的實踐(不要將hibernate和數據庫orm框架聯系在一起),他提供了相應的實現,並增加了一些其他校驗注解,如@Email,@Length,@Range等等,他們位於org.hibernate.validator.constraints包下。
2.校驗的方式,目前我們的project中,大部分是在后端自己寫邏輯進行校驗,比如判斷日期格式是否是yyyy-mm-dd,或者判斷傳入參數是否是限定的幾個中的一個,這導致寫了很多無聊的邏輯....其實spring提供了校驗的類庫, 我們可以在其基礎上構建自己需要的功能。
構建校驗的順序:
值得注意的地方:
<1> 參數Foo前需要加上@Validated注解,表明需要spring對其進行校驗,而校驗的信息會存放到其后的BindingResult中。注意,必須相鄰,如果有多個參數需要校驗,形式可以如下。foo(@Validated Foo foo, BindingResult fooBindingResult ,@Validated Bar bar, BindingResult barBindingResult);即一個校驗類對應一個校驗結果。
<2> 校驗結果會被自動填充,在controller中可以根據業務邏輯來決定具體的操作,如跳轉到錯誤頁面。
下面着重介紹下自定義校驗,比如最近的一個需求,前端傳入String 類型的參數duration,周期只能是4w,12w,26w,52w,104w這五個中的一個,如果不是,返回invalidArgumention,這種惡心又必要的功能,還是交給自定義校驗好了。。。。。。
自定義校驗順序:
1.創建自定義注解
validatedBy 中填寫自己傳教的校驗類
2.編寫自己的校驗類
校驗類要繼承ConstraintValidator,然后isValid函數里面驗證參數是否有效。
3.在Controller方法中傳入校驗類類型的參數
原理及其調用鏈:
在分發url請求調用doDispatch之后,resolveArgument
然后調用SpringValidatorAdapter下的方法