Spring Boot 如何做參數校驗?


作者:狂亂的貴公子
cnblogs.com/cjsblog/p/8946768.html

1、背景介紹

開發過程中,后台的參數校驗是必不可少的,所以經常會看到類似下面這樣的代碼。

這樣寫並沒有什么錯,還挺工整的,只是看起來不是很優雅而已。

接下來,用Validation來改寫這段。

2、Spring Boot文檔中的Validation

在Spring Boot的官網中,關於Validation只是簡單的提了一句,如下

其實,Spring ValidatorHibernate 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

參考

推薦去我的博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM