已校正、有效、校正器,你知道它們的區別嗎

相關標籤:1.阿里雲提供 FIPS 認證的硬體安全模組用於密鑰安全
2. 網域名稱有效性

已校正、有效、校正器,你知道它們的區別嗎

1. 結論先行
Valid VS Validated 相同點
•兩種方法和參數都可以被校正
•@Valid 和 @Validated 兩個註解都會觸發標準 Bean 校正。
如果校正失敗,將拋出 BindException 並返回 400(BAD_REQUEST)響應;或者可以通過控制器中的 Errors 或 BindingResult 參數本地處理校正錯誤。此外,如果參數前有 @RequestBody 註解,校正錯誤將拋出 MethodArgumentNotValidException 異常。
JSR 380
JSR 380 是 Bean 校正的 Java API 規範,是 Jakarta EE 和 Java SE 的一部分。確保 Bean 的屬性滿足特定條件,使用 @NotNull、@Min 和 @Max 等註解。

此版本需要 Java 8 或更高版本,並利用了 Java 8 中添加的新特性,例如類型註解以及對 Optional 和 LocalDate 等新類型的支援。
有關規範的完整資訊,請繼續閱讀 JSR 380。

@Valid 和 @Validated 有什麼區別?


javax.validation.Valid _
o是 JSR-303 規範的標準註解支援,是一個標記註解。
o註解支援 ElementType#METHOD、ElementType#FIELD、ElementType#CONSTRUCTOR,
oElementType#PARAMETER、ElementType#TYPE_USE
•org.springframework.validation.annotation.Validated _
o它是 Spring 製作的自訂註解,增強了分組功能。
o註解支援 ElementType#TYPE、ElementType#METHOD、ElementType#PARAMETER
@Valid 和 @Validated 的區別

已校正、有效、校正器.Validator


Bean Validation 2.0(JSR 380)定義了用於實體和方法校正的中繼資料模型和 API,Hibernate Validator 是目前最佳的實現
Validator 介面有三個方法可用於校正整個實體或僅校正實體的單個屬性
•Validator#validate() 校正所有 Bean 上的所有約束
•Validator#validateProperty() 校正單個屬性
•Validator#validateValue() 檢查給定類的單個屬性是否可以成功校正
無論是 requestBody 參數校正還是方法級校正,最終都是調用 Hibernate Validator 來執行校正,Spring Validation 只是做了一層封裝。
校正使用者輸入是我們大多數應用中的常見功能。在 Java 生態系統中,我們專門使用 Java 標準 Bean 校正 API 來支援這一點。此外,從 4.0 版本開始,這也與 Spring 很好地整合在一起。
在接下來的章節中,讓我們詳細瞭解它們。

@Valid 和 @Validated 註解
在 Spring 中,我們使用 JSR-303 的 @Valid 註解進行方法級校正。此外,我們還用它來標記需要校正的成員屬性。但是,此註解不支援分組校正。
分組有助於限制校正期間應用的約束。一個特殊的用例是 UI 嚮導。在這裡,在第一步中,我們可能有一些欄位子集。在後續步驟中,可能有屬於同一 Bean 的另一組。因此我們需要在每一步對這些有限的欄位應用約束,但 @Valid 不支援這一點。
在這種情況下,對於分組層級,我們必須使用 Spring 的 @Validated,它是 JSR-303 的 @Valid 的變體。這用於方法級。對於標記成員屬性,我們繼續使用 @Valid 註解。
現在,讓我們直接跳進去看看這些註解的用法樣本。



3. 樣本


讓我們考慮一個用 Spring Boot 開發的簡單使用者註冊。首先,我們只有名字和密碼屬性:

在確認測試成功運行後,我們現在擴充功能。下一個邏輯步驟是將其轉換為複雜使用者註冊。對於第一步,名字和密碼保持不變。在第二步中,我們將獲得年齡和手機等附加資訊。因此我們將用這些附加欄位更新我們的領域對象:

然而,這次我們會注意到之前的測試失敗了。這是因為我們沒有傳入年齡和手機欄位。為了支援這種行為,我們需要分組校正和 @Validated 註解。

為此,我們需要對欄位進行分組,建立兩個不同的組。首先,我們需要建立兩個標記介面。每個組或每個步驟一個。我們可以參考我們關於分組校正的文章來瞭解它是如何?的。在這裡,讓我們關注註解的差異。
我們將有 BasicInfo 介面用於第一步,AdvanceInfo 用於第二步。此外,我們將更新 UserAccount 類以使用這些標記介面如下:
接下來,讓我們看看 @Valid 如何觸發嵌套屬性的校正。

已校正、有效、校正器.使用 @Valid 嵌套校正


@Valid 註解用於校正嵌套屬性。這會觸發嵌套對象的校正。例如,在我們當前的情境中,讓我們建立一個 UserAddress 對象:
5. 結合 @Valid 和 @Validated 執行集合校正
如果請求體直接將 json 數組傳遞給後端,並且您想對數組中的每一項進行參數校正。此時,如果我們直接使用 java.util.Collection 下的 list 或 set 來接收資料,參數校正將不會生效!我們可以使用自訂的 list 集合來接收參數:
•封裝 List 類型並聲明 @Valid 註解
package com.devicemag.core.BO;

import javax.validation.Valid ; _
import java.util .*;

已校正、有效、校正器結論

已校正、有效、校正器.總之,對於任何基礎校正,我們將在方法調用上使用 JSR @Valid 註解。另一方面,對於任何分組校正,包括分組序列,我們需要在方法調用中使用 Spring 的 @Validated 註解。@Valid 註解也需要用於觸發嵌套屬性的校正。
Validated 仍然是 AOP。在方法校正中,使用 AOP 動態攔截方法,並使用 JSR303 Validator 完成校正。在 Bean 的屬性校正中,它基於 Bean 的生命週期,在其初始化前後完成校正。
phone 聯絡我們
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.