作者:狂亂的貴公子
cnblogs.com/cjsblog/p/8946768.html
1、背景介紹
開發程序中,后臺的引數校驗是必不可少的,所以經常會看到類似下面這樣的代碼,

這樣寫并沒有什么錯,還挺工整的,只是看起來不是很優雅而已,
接下來,用Validation來改寫這段,
2、Spring Boot檔案中的Validation
在Spring Boot的官網中,關于Validation只是簡單的提了一句,如下

其實,Spring Validator和Hibernate Validator是兩套Validator,可以混著用,這里我們用Hibernate Validator,在Java技術堆疊微信公眾號后臺回復關鍵字:boot,可以獲取更多堆疊長整理的 Spring Boot 系列技術干貨,
3、Hibernate Validator
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface
4、Spring Validator
https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#validation
5、示例
5.1、引入spring-boot-starter-validation

5.2、定義一個物件

5.3、適用@Valid校驗,并將校驗結果放到BindingResult物件中
推薦閱讀:引數驗證 @Validated 和 @Valid 的區別,

注意:
-
默認情況下,如果校驗失敗會拋javax.validation.ConstraintViolationException例外,可以用統一例外處理去對這些例外做處理
-
An Errors/BindingResult argument is expected to be declared immediately after the model attribute
推薦閱讀:引數驗證 @Validated 和 @Valid 的區別,
5.4、看效果


如果在校驗的物件后面再加上Model物件的話,如果回傳的是ModelAndView就可以將這個Model設定到其中,這樣在頁面就可以取到錯誤訊息了

僅僅只是單欄位校驗的話未免也太不靈活了吧,如果欄位之間有關聯關系,那該如何校驗呢?答案是自定義,
5.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、補充
6.1、校驗模式
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast
下面補充一點,關于校驗模式,
默認會校驗完所有屬性,然后將錯誤資訊一起回傳,但很多時候不需要這樣,一個校驗失敗了,其它就不必校驗了,為此,需要這樣設定?

6.2、單個引數校驗



如果是調整頁面的時候引數校驗失敗的話,這時可以不做處理,讓其調到錯誤頁面,
如果是介面引數校驗失敗的話,可以在這里進行統一處理,并回傳,例如:

6.3、錯誤頁面


以剛才優惠券詳情為例
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.4、@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
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/186826.html
標籤:Java
