buildValidatorFactory メソッドおよび buildDefaultValidatorFactory メソッドでの振る舞いの変更を確認する

この規則は、javax.validation.Validation.buildDefaultValidatorFactory() または Validation.byDefaultProvider().configure().buildValidatorFactory() が使用されている場合にフラグを立てます。 Liberty beanValidation-1.0 実装および beanValidation-1.1 実装は、Apache Bean Validation によって提供されます。Java EE 8 では、Liberty フィーチャー beanValidation-2.0 によって提供される Bean Validation 実装は Hibernate Validator に変更されました。Apache Bean Validation 実装では、アプリケーションが非管理対象 ValidatorFactory オブジェクトを作成する必要があり、ConstraintValidatorFactory は CDI によって管理される ConstraintValidator インスタンスを返します。しかし、Hibernate Validator は、サーバー・ランタイムによって提供されるデフォルトの ValidatorFactory を使用した、CDI によって管理される ConstraintValidator オブジェクトの生成のみをサポートします。サーバーによって管理されるこの ValidatorFactory は、@Resource@Inject、または直接 JNDI 検索を使用することで取得できます。

javax.validation.Validation.buildDefaultValidatorFactory() または Validation.byDefaultProvider().configure().buildValidatorFactory() を使用している場合、アプリケーションでの振る舞いが変更される可能性があります。 buildValidatorFactory() が呼び出される前に、messageInterpolator()traversableResolver()parameterNameProvider()、または constraintValidatorFactory() などのその他のカスタマイズ・メソッドを呼び出すことができます。

要約すると、ConstraintValidatorFactory によって返されるオブジェクトが CDI によって管理されるオブジェクトである必要があるユーザーは、既存の Bean Validation コードに対する変更を実装しなければなりません。

以下のコードは、リファクタリングする必要がある Bean Validation 使用法の例です。

//元のアプリケーションの振る舞い
Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(messageResourceInterpolator).buildValidatorFactory().getValidator();

以下のコードは、問題のあるコードの修正を示しています。

//推奨されるアプリケーションの振る舞い (考えられるクイック・フィックス)
@Inject    //java:comp/ValidatorFactory の @Resource または JNDI 検索もコンテナーのデフォルト ValidatorFactory を取得するために使用できます
ValidatorFactory validatorFactory;
Validator validator =  validatorFactory.usingContext().messageInterpolator(messageResourceInterpolator).getValidator();

WebSphere Liberty での妥当性検査の構成について詳しくは、 Bean Validation 2.0 の資料を参照してください。