Это правило помечает вызовы методов javax.validation.Validation.buildDefaultValidatorFactory() и Validation.byDefaultProvider().configure().buildValidatorFactory(). Реализации beanValidation-1.0 и beanValidation-1.1 в Liberty созданы на основе Apache Bean Validation. В Java EE 8 реализация Bean Validation предоставлена компонентом Liberty beanValidation-2.0, который был изменен на Hibernate Validator. Согласно требованиям реализации Apache Bean Validation, приложение должно создать неуправляемый объект ValidatorFactory, а ConstraintValidatorFactory возвращает управляемый CDI экземпляр ConstraintValidator. Однако компонент Hibernate Validator поддерживает создание управляемых CDI объектов ConstraintValidator только с помощью ValidatorFactory по умолчанию из среды выполнения сервера. Этот управляемый сервером объект 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 // Аннотацию @Resource и поиск java:comp/ValidatorFactory в JNDI тоже можно использовать для получения ValidatorFactory по умолчанию контейнера
ValidatorFactory validatorFactory;
Validator validator = validatorFactory.usingContext().messageInterpolator(messageResourceInterpolator).getValidator();
|
За дополнительной информацией о проверке в WebSphere Liberty обратитесь к документации по Bean Validation 2.0.