Verificar uma mudança de comportamento nos métodos buildValidatorFactory e buildDefaultValidatorFactory

Esta regra sinaliza qualquer uso de javax.validation.Validation.buildDefaultValidatorFactory() ou Validation.byDefaultProvider().configure().buildValidatorFactory() . O Liberty beanValidation-1.0 e beanValidation-1.1 As implementações são fornecidas pelo Apache Bean Validation. No Java EE 8, a implementação do Bean Validation fornecida pelo recurso Liberty beanValidation-2.0 foi alterado para Hibernate Validator. A implementação da Validação do Bean do Apache requer um aplicativo para criar um objeto ValidatorFactory não gerenciado e a ConstraintValidatorFactory retorna uma instância ConstraintValidator gerenciada por CDI. No entanto, o Hibernate Validator suporta apenas a geração de objetos ConstraintValidator gerenciados por CDI com uma ValidatorFactory padrão fornecida pelo tempo de execução do servidor. Esse servidor gerenciado ValidatorFactory pode ser obtido por meio do uso de @Resource , @Inject ou consulta JNDI direta.

Os aplicativos poderiam ver uma mudança no comportamento ao usar javax.validation.Validation.buildDefaultValidatorFactory() ou Validation.byDefaultProvider().configure().buildValidatorFactory() . Observe que outros métodos de customização podem ser chamados antes buildValidatorFactory() é chamado, como messageInterpolator() , traversableResolver() , parameterNameProvider() ou constraintValidatorFactory() .

Em resumo, os usuários que esperam os objetos retornados por ConstraintValidatorFactory ser gerenciado pelo CDI precisará implementar mudanças em seu código de Validação de Bean existente.

O código a seguir é um exemplo de uso da Validação de Bean que deve ser refatorada:


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

O código a seguir mostra a correção para o código problemático:


//Recommended application behavior (potential Automated 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();

Para obter mais informações sobre como configurar a validação no WebSphere Liberty, consulte a documentação Bean Validation 2.0.