Ricerca di una modifica al comportamento nei metodi buildValidatorFactory e buildDefaultValidatorFactory

Questa regola contrassegna qualsiasi utilizzo di javax.validation.Validation.buildDefaultValidatorFactory() o Validation.byDefaultProvider().configure().buildValidatorFactory(). Le implementazioni beanValidation-1.0 e beanValidation-1.1 Liberty sono fornite da Apache Bean Validation. In Java EE 8, l'implementazione Bean Validation fornita dalla funzione Liberty beanValidation-2.0 è stata modificata in Hibernate Validator. L'implementazione Apache Bean Validation necessita di un'applicazione per creare un oggetto ValidatorFactory non gestito, mentre ConstraintValidatorFactory restituisce un'istanza ConstraintValidator gestita da CDI. Tuttavia, Hibernate Validator supporta solo la generazione di oggetti ConstraintValidator gestiti da CDI con un ValidatorFactory fornito dal runtime del server. Tale ValidatorFactory gestito dal server può essere ottenuto attraverso l'utilizzo di @Resource, @Inject o della ricerca JNDI diretta.

Le applicazioni possono rilevare una modifica al comportamento durante l'utilizzo di javax.validation.Validation.buildDefaultValidatorFactory() o Validation.byDefaultProvider().configure().buildValidatorFactory(). Notare che altri metodi di personalizzazione possono essere richiamati prima di buildValidatorFactory(), come messageInterpolator(), traversableResolver(), parameterNameProvider() o constraintValidatorFactory().

In sintesi, gli utenti che prevedono che gli oggetti restituiti da ConstraintValidatorFactory siano oggetti gestiti da CDI, dovranno implementare le modifiche al relativo codice Bean Validation esistente.

Il seguente codice è un esempio di utilizzo di Bean Validation da sottoporre al refactoring:

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

Il seguente codice mostra la correzione per il codice problematico:

//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();

Per ulteriori informazioni sulla configurazione della convalida in WebSphere Liberty, consultare la documentazione Bean Validation 2.0.