學(xué)習(xí)記錄之VALIDATION
Spring Validation的主要作用是檢查請求參數(shù)的基本格式。
關(guān)于檢查請求參數(shù):
????需要注意:在開發(fā)實踐中,無論是客戶端的項目(例如網(wǎng)頁前端),還是服務(wù)器端的項目,都需要對用戶填寫、選擇的數(shù)據(jù)進(jìn)行檢查!
????其實,最終能夠保證數(shù)據(jù)有效的一定是服務(wù)器端的檢查,所以,服務(wù)器端必須對請求參數(shù)進(jìn)行檢查,僅當(dāng)數(shù)據(jù)的基本格式有效后,才進(jìn)行相關(guān)的處理。
????客戶端的檢查應(yīng)該是不作為最終保障的,在前后端分離的模式下,服務(wù)器端無法保證所有客戶端都采取了統(tǒng)一、有效的驗證規(guī)則!因為客戶端的檢查可能并未實現(xiàn)、用戶設(shè)備中客戶端軟件的版本并未升級,甚至,客戶端軟件是可能偽造、篡改的。
????即使客戶端的檢查不一定是可靠的,但是,所有客戶端仍應(yīng)該對請求參數(shù)進(jìn)行檢查,如果參數(shù)的基本格式不符合要求,則不應(yīng)該提交請求!畢竟客戶端的檢查可以把絕大部分錯誤攔截掉(不會低級錯誤的請求發(fā)到服務(wù)器端),以減輕服務(wù)器端的壓力。
在Spring Boot項目中,使用Spring Boot Validation的依賴項是:
基本使用:
????在控制器處理請求的方法中,對需要驗證的請求參數(shù)添加`@Valid`或`@Validated`注解,表示此參數(shù)是需要通過Spring Boot Validation進(jìn)行檢查的,例如:
在封裝了請求參數(shù)的POJO類中,在各需要驗證格式的屬性之前,添加檢查格式的注解,即可實現(xiàn)格式的驗證,例如:
處理異常:
當(dāng)請求參數(shù)不符合注解對應(yīng)的規(guī)則時,將拋出`org.springframework.validation.BindException`,所以,應(yīng)該在統(tǒng)一處理異常的類中,對此異常進(jìn)行處理。
先在`ServiceCode`中添加新的業(yè)務(wù)狀態(tài)碼,對應(yīng)請求參數(shù)格式錯誤:
然后,`GlobalExceptionHandler`中對此異常進(jìn)行處理:
在`BindException`的錯誤信息(`message`)中,將包含大量的信息,不利于響應(yīng)到客戶端去,例如,以上處理方式的響應(yīng)大概是:
為了保證處理異常后響應(yīng)的消息是易于閱讀的,應(yīng)該對錯誤信息(`message`)進(jìn)行處理:
關(guān)于檢查參數(shù)格式的注解:
@NotNull`:不允許為`null`,即必須提交此名稱對應(yīng)的參數(shù)
@NotEmpty`:不允許為空字符串(長度為0的字符串) 注意:只能應(yīng)用于字符串格式的參數(shù)
`@NotBlank`:不允許為空白(字符串長度可能大于0,卻是由空格、TAB等空白輸入的)
??注意:只能應(yīng)用于字符串格式的參數(shù)
?`@Min`:設(shè)置數(shù)值類型的最小值? 僅用于數(shù)值類型的請求參數(shù) 可被`@Range`取代
? `@Max`:設(shè)置數(shù)值類型的最大值 僅用于數(shù)值類型的請求參數(shù) 可被`@Range`取代
?`@Range`:設(shè)置數(shù)據(jù)類型的取值區(qū)間,可設(shè)置最小值和最大值? 此注解的`min`屬性默認(rèn)為`0`,`max`屬性默認(rèn)為`long`類型的最大值 僅用于數(shù)值類型的請求參數(shù)
`@Pattern`:配置正則表達(dá)式 不能取代`@NotNull`注解
在開發(fā)實踐中,對于字符串類型的請求參數(shù),應(yīng)該同時使用`@NotNull`(如果你認(rèn)為必須提交)和`@Pattern`,而`@NotEmpty`、`@NotBlank`通常不需要使用,除非你對此字符串的值沒有太多要求,對于數(shù)值類型的請求參數(shù),應(yīng)該同時使用`@NotNull`和`@Range`。
需要注意:對于數(shù)值類型的屬性,如果提交的請求參數(shù)不能夠轉(zhuǎn)換成數(shù)值類型,則這些注解將不生效,且報錯。另外,在開發(fā)實踐中,通常會將使用到的正則表達(dá)式、出錯時的提示文本封裝在專門的類或接口中,各POJO類型直接引用即可。