此規則會標示任何使用 javax.validation.Validation.buildDefaultValidatorFactory() 或 Validation.byDefaultProvider().configure().buildValidatorFactory() 之處。Liberty beanValidation-1.0 和 beanValidation-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 文件。