檢查 buildValidatorFactory 和 buildDefaultValidatorFactory 方法中的行為變更

此規則會標示任何使用 javax.validation.Validation.buildDefaultValidatorFactory()Validation.byDefaultProvider().configure().buildValidatorFactory() 之處。Liberty beanValidation-1.0beanValidation-1.1 實作由 Apache Bean 驗證提供。在 Java EE 8 中,Liberty 特性 beanValidation-2.0 提供的 Bean 驗證實作已變更為 Hibernate Validator。Apache Bean 驗證實作要求應用程式建立未受管理的 ValidatorFactory 物件,而且 ConstraintValidatorFactory 會傳回 CDI 管理的 ConstraintValidator 實例。然而,Hibernate Validator 僅支援以伺服器執行時期提供的預設 ValidatorFactory 來產生 CDI 管理的 ConstraintValidator 物件。您可以使用 @Resource@Inject 或直接 JNDI 查閱,以取得這個由伺服器管理的 ValidatorFactory。

使用 javax.validation.Validation.buildDefaultValidatorFactory()Validation.byDefaultProvider().configure().buildValidatorFactory() 時,應用程式可以看到行為變更。請注意,在呼叫 buildValidatorFactory() 之前,可以呼叫其他自訂方法,例如 messageInterpolator()traversableResolver(), parameterNameProvider()constraintValidatorFactory()

總之,如果使用者期望 ConstraintValidatorFactory 傳回的物件是由 CDI 管理,則將需要實作現有 Bean 驗證程式碼的變更。

下列程式碼舉例說明了應該重構的 Bean 驗證用法:

//Original application behavior
Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(messageResourceInterpolator).buildValidatorFactory().getValidator();

下列程式碼顯示了有問題程式碼的修正程式:

//Recommended application behavior (potential quick fix)
@Inject    //@Resource or a jndi lookup of java:comp/ValidatorFactory could also be used to obtain the container's default ValidatorFactory
ValidatorFactory validatorFactory;
Validator validator =  validatorFactory.usingContext().messageInterpolator(messageResourceInterpolator).getValidator();

如需在 WebSphere Liberty 中配置驗證的相關資訊,請參閱 Bean 驗證 2.0 文件。