Verificaţi pentru o modificare de comportament în metodele buildValidatorFactory şi buildDefaultValidatorFactory

Această regulă semnalează orice utilizare a javax.validation.Validation.buildDefaultValidatorFactory() sau Validation.byDefaultProvider().configure().buildValidatorFactory(). Implementările Liberty beanValidation-1.0 şi beanValidation-1.1 sunt furnizate de Apache Bean Validation. În Java EE 8, implementarea Bean Validation furnizată de caracteristica Liberty beanValidation-2.0 a fost modificată la Hibernate Validator. Implementarea Apache Bean Validation necesită o aplicaţie pentru a crea un obiect ValidatorFactory negestionat şi ConstraintValidatorFactory returnează o instanţă ConstraintValidator gestionată de CDI. Dar, Hibernate Validator suportă doar generare de obiecte ConstraintValidator gestionate CDI cu un ValidatorFactory implicit furnizat de runtime-ul serverului. Aceste ValidatorFactory gestionat de server poate fi obţinut prin utilizarea @Resource, @Inject sau căutării JNDI directe.

Aplicaţiile ar putea vedea o modificare de comportament când se utilizează javax.validation.Validation.buildDefaultValidatorFactory() sau Validation.byDefaultProvider().configure().buildValidatorFactory(). Reţineţi că alte metode de personalizare pot fi apelate înainte ca buildValidatorFactory() să fie invocat, cum ar fi messageInterpolator(), traversableResolver (), parameterNameProvider() sau constrângintValidatorFactory().

În concluzie, utilizatorii care se aşteaptă ca obiectele returnate de ConstraintValidatorFactory să fie gestionate de CDI vor trebui să implementeze modificările la codul de Validare bean existent.

Următorul cod este un exemplu de utilizare a validării bean-urilor care ar trebui să fie refactorizată:

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

Următorul cod arată corecţia pentru codul problematic:

//Recommended application behavior (potential quick fix)
@Inject    //@Resource sau o căutare jndi pentru java:comp/ValidatorFactory ar putea fi de asemenea folosită pentru a obţine valoarea implicită ValidatorFactory a containerului
ValidatorFactory validatorFactory;
Validator validator =  validatorFactory.usingContext().messageInterpolator(messageResourceInterpolator).getValidator();

Pentru mai multe informaţii despre configurarea validării în WebSphere Liberty, vedeţi documentaţia Bean Validation 2.0.