javax.validation
和jakarta.validation
都是用於Java中進行資料驗證(validation)的相關API,它們提供了一套標準的驗證框架,用於驗證Java物件的屬性是否符合指定的約束條件。這兩個API的作用類似,只是在Java EE平臺的演進過程中發生了一些變化。
javax.validation
:
javax.validation
是最初引入Java EE平臺的資料驗證API,定義在JSR 303(Bean Validation 1.0)和JSR 380(Bean Validation 2.0)中。- 提供了註解(如@NotNull、@Size、@Email等)和驗證器(Validator)等核心概念,用於對Java物件進行資料驗證。
- 可以透過
Validator
介面來執行驗證操作,檢查物件是否符合預定義的約束。 - 在Java EE 6及之後的版本中,可以直接使用
javax.validation
進行資料驗證。
jakarta.validation
:
jakarta.validation
是隨著Java EE平臺向Jakarta EE的遷移而產生的,為了避免因為商標問題而將原有的javax
包遷移到jakarta
包下。jakarta.validation
與javax.validation
具有相同的功能和API,但包名不同,屬於Jakarta EE規範的一部分。- 隨著Java EE的發展,未來新的版本可能會使用
jakarta.validation
作為預設的資料驗證API。
作用:
- 資料驗證:透過註解和驗證器,對Java物件的屬性進行驗證,確保資料符合指定的約束條件。
- 提高資料質量:有效地防止無效資料進入系統,提高資料的準確性和完整性。
- 簡化開發:透過標準化的驗證框架,簡化資料驗證邏輯的編寫和維護工作。
總的來說,javax.validation
和jakarta.validation
都是用於資料驗證的標準API,可以幫助開發者實現對Java物件的資料驗證功能,並提高系統的資料質量和穩定性。根據具體的Java平臺版本和規範要求,選擇合適的驗證API來進行資料驗證。
可能涉及到的包引用
jakarta
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.5.Final</version>
</dependency>
javax
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version>
</dependency>
請注意,當你手動引用hibernate-validator包時,是不需要再手動引用validation-api的,因為它已經被hibernate-validator依賴了
什麼時候需要手動引用jakarta.validation-api
當你需要手動使用Validation
物件時,這時,你必須手動顯示的引入jakarta.validation-api
,或者早期的javax.validation:validation-api
包。
錯誤排除
當你使用7.0.5.Final版本的validator後,可能出現如何錯誤 dubbo rest business exception, error cause is: null message is: Unable to create a Configuration, because no Jakarta Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
,這時,你需要升級你的版本,來解決這個錯誤,升級包如下:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
升級到8.0.1.Final之後,問題得到解決,可正常提供錯誤訊息
驗證工具類
/**
* bean物件屬性驗證 使用此方法等同於引數前加註解@Validated,@Valid
**/
public class BeanValidatorUtils {
private static final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
/**
* 校驗實體中欄位的合法性
* @param object
* @param groups
* @throws ConstraintViolationException
*/
public static void validateWithException(Object object, Class<?>... groups) throws ConstraintViolationException {
Set<ConstraintViolation<Object>> constraintViolations = validatorFactory.getValidator().validate(object,
groups);
if (!constraintViolations.isEmpty()) {
throw new ConstraintViolationException(constraintViolations);
}
}
}