一、背景介紹
開發過程當中,後臺的參數校驗是必不可少的,因此常常會看到相似下面這樣的代碼php
這樣寫並無什麼錯,還挺工整的,只是看起來不是很優雅而已。html
接下來,用Validation來改寫這段java
二、Spring Boot文檔中的Validation
在Spring Boot的官網中,關於Validation只是簡單的提了一句,以下spring
其實,Spring Validator和Hibernate Validator是兩套Validator,能夠混着用,這裏咱們用Hibernate Validatorapp
三、Hibernate Validator
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#prefacespring-boot
四、Spring Validator
https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#validationspa
五、示例
5.一、引入spring-boot-starter-validation
5.二、定義一個對象
5.三、適用@Valid校驗,並將校驗結果放到BindingResult對象中
注意:.net
- 默認狀況下,若是校驗失敗會拋javax.validation.ConstraintViolationException異常,能夠用統一異常處理去對這些異常作處理
- An Errors/BindingResult argument is expected to be declared immediately after the model attribute
5.四、看效果
若是在校驗的對象後面再加上Model對象的話,若是返回的是ModelAndView就能夠將這個Model設置到其中,這樣在頁面就能夠取到錯誤消息了hibernate
僅僅只是單字段校驗的話未免也太不靈活了吧,若是字段之間有關聯關係,那該如何校驗呢?答案是自定義3d
5.五、自定義校驗規則
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints
這裏,以優惠券建立爲例來演示如何自定義校驗規則
首先,優惠券表單以下(僅僅只是演示用):
這裏除了自定義了兩條校驗規則以外,還用到了分組。
爲何要有分組這一說呢?由於,舉個例子,添加的時候不須要校驗id,而修改的時候id不能爲空,有了分組之後,就能夠添加的時候校驗用組A,修改的時候校驗用組B
下面重點看一下@CheckTimeInterval
第一步、定義一個註解叫CheckTimeInterval
第二步、定義Validator去校驗它
順便提一句,這裏BeanWrapper去取對象的屬性值,咱們稍微看一下BeanWrapper是作什麼的
言歸正傳
第三步、驗證
看,自定義的校驗生效了
六、補充
6.一、校驗模式
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast
下面補充一點,關於校驗模式
默認會校驗完全部屬性,而後將錯誤信息一塊兒返回,但不少時候不須要這樣,一個校驗失敗了,其它就沒必要校驗了
爲此,須要這樣設置
6.二、單個參數校驗
若是是調整頁面的時候參數校驗失敗的話,這時能夠不作處理,讓其調到錯誤頁面。
若是是接口參數校驗失敗的話,能夠在這裏進行統一處理,並返回。例如:
6.三、錯誤頁面
以剛纔優惠券詳情爲例
http://localhost:8080/coupon/detail.html 400
http://localhost:8080/coupon/detail.html?id= 400
http://localhost:8080/coupon/detail.html?id=abc 400
http://localhost:8080/coupon/detail222.html?id=123 404
無權限 403
int a = 1 / 0; 500
6.四、@Valid與@Validated
https://blog.csdn.net/qq_27680317/article/details/79970590
參考
http://rensanning.iteye.com/blog/2357373
https://blog.csdn.net/kenight/article/details/77774465
https://www.cnblogs.com/mr-yang-localhost/p/7812038.html
https://www.phpsong.com/3567.html
https://www.cnblogs.com/mr-yang-localhost/p/7812038.html