dubbo~javax.validation和jakarta.validation的介紹與排雷

张占岭發表於2024-05-30

javax.validationjakarta.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.validationjavax.validation具有相同的功能和API,但包名不同,屬於Jakarta EE規範的一部分。
  • 隨著Java EE的發展,未來新的版本可能會使用jakarta.validation作為預設的資料驗證API。

作用:

  • 資料驗證:透過註解和驗證器,對Java物件的屬性進行驗證,確保資料符合指定的約束條件。
  • 提高資料質量:有效地防止無效資料進入系統,提高資料的準確性和完整性。
  • 簡化開發:透過標準化的驗證框架,簡化資料驗證邏輯的編寫和維護工作。

總的來說,javax.validationjakarta.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);
   	}
   }

}

相關文章