前文已覆蓋約束註解定義與基本驗證用法。本章深入剖析規範定義的四大類擴展接口,並以參考實現 Hibernate Validator 4.0 為例,闡述 SPI 架構與客製化擴展路徑。
五大核心接口協同完成 Provider 發現、配置收集、工廠構建:
| 接口 | 職責 |
|---|---|
javax.validation.Validation | API 入口,啟動環境中 ValidationProvider 具體實現,產生 Configuration 實例。 |
ValidationProviderResolver | 掃描類路徑下 META-INF/services/javax.validation.spi.ValidationProvider,返回所有 Provider 列表。規範提供預設實現。 |
javax.validation.spi.ValidationProvider | 具體 Provider(如 Hibernate Validator)必須實現,負責生成 Configuration 實現。 |
javax.validation.Configuration | 收集上下文配置,委派給 ValidatorFactory。 |
javax.validation.ValidatorFactory | 從 Provider 構建 Validator 實例,驗證客戶端的核心入口。 |
定義三種驗證進入點:
| 方法 | 用途 |
|---|---|
validate(T object, Class>... groups) | 驗證整個物件圖 |
validateProperty(T object, String propertyName, Class>... groups) | 驗證單一屬性/欄位 |
validateValue(Class<T> beanType, String propertyName, Object value, Class>... groups) | 驗證指定屬性的特定值(無需物件實例) |
// 預設模式:類路徑單一 Provider 時
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
// 顯式指定 Hibernate Validator
Configuration<HibernateValidatorConfiguration> config =
Validation.byProvider(HibernateValidator.class).configure();
ValidatorFactory vf = config.buildValidatorFactory();
Validator validator = vf.getValidator();
// 自定義 Provider 解析規則
Configuration<?> config = Validation.byDefaultProvider()
.providerResolver(new MyValidationProviderResolver()).configure();
Validator validator = config.buildValidatorFactory().getValidator();
驗證失敗時返回 Set<ConstraintViolation<T>>,提供訊息、屬性路徑、無效值等豐富上下文:
Set<ConstraintViolation<Employee>> violations = validator.validate(employee);
for (ConstraintViolation<Employee> v : violations) {
System.out.println(v.getMessage());
}
預設從類路徑 ValidationMessages.properties 讀取,亦可在註解 message 屬性覆蓋。實現 MessageInterpolator 介面可注入業務相關的動態插值邏輯:
Configuration<?> config = Validation.byDefaultProvider().configure();
config.messageInterpolator(new MyMessageInterpolator(config.getDefaultMessageInterpolator()));

圖示展示了規範 API 與 Hibernate Validator 4.0 具體實現類的對應關係,為 SPI 擴展開發提供直觀導航。