Bean Validation @NotNull, @NotBlank e @NotEmpty non funzionano in JSF + Tomcat

Sto usando le annotazioni di convalida Hibernate nel mio bean gestito JSF. Quando uso @NotNull , @NotBlank o @NotEmpty non sembrano essere triggersti ​​in alcun modo.

 @NotBlank(message = "{name.required}") public String name; 

Vista:

    

Come è causato e come posso risolverlo?

introduzione

Dal momento che non hai dato alcun feedback sul mio commento con la domanda su quale contenitore stai usando, ho sbirciato nella tua cronologia domande per sapere quali contenitori stai usando tutti. Finora ho trovato solo Tomcat . Quindi, per questa risposta, presumo che tu stia effettivamente utilizzando Tomcat come ho inizialmente intuito pubblicando il commento.

Assicurati di installare tutti i JAR

Tomcat non viene spedito con nessuna API / implementazione di certificazione Bean JSR303. Devi scaricarlo e installarlo da solo. Il fatto di avere queste annotazioni da compilare significa che hai abbandonato correttamente il file hibernate-validator.jar (la denominazione potrebbe essere diversa a seconda della versione) nella cartella /WEB-INF/lib della tua webapp. Il fatto che quelle annotazioni a loro volta non funzionino in alcun modo può significare solo che non hai letto il file readme.txt e / o hai dimenticato di aggiungere i JAR dalla cartella /lib/required del file zip / tgz della libreria di Hibernate Validator : slf4j-api.jar e validation-api.jar . L’ultimo è obbligatorio per far funzionare effettivamente le annotazioni. Quindi, per far funzionare Hibernate Validator in Tomcat, sono necessari i seguenti JAR in webapp’s /WEB-INF/lib :

  • validation-api.jar (contiene l’API astratta e lo scanner di annotazioni)
  • hibernate-validator.jar (contiene l’implementazione concreta)
  • slf4j-api.jar (solo per far funzionare anche il suo logger)

In questo modo @NotBlank e @NotEmpty devono funzionare. Il @NotNull merita un’attenzione speciale; i campi di input vuoti sono cioè per impostazione predefinita ricevuti come stringhe vuote dal client (browser web) a causa della natura dei parametri di richiesta HTTP. Le stringhe vuote non sono uguali a null , quindi il @NotNull per impostazione predefinita non esegue mai il kick in. JSF è tuttavia configurabile per interpretarle come null aggiungendo semplicemente il seguente parametro di contesto a web.xml :

  javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL true  

In questo modo anche il @NotNull deve funzionare.

BV funziona ma solo i campi vuoti no

Se ancora non funziona (cioè nessuna delle 3 annotazioni funziona, ma altre come @Size(min=5) per una lunghezza minima di 5 funziona bene), quindi è probabile che tu abbia il seguente parametro di contesto nel web.xml pure:

  javax.faces.VALIDATE_EMPTY_FIELDS false  

Dovresti quindi rimuoverlo (il valore predefinito è auto , cioè solo quando l’API di convalida dei bean JSR303 viene trovata nel percorso di class di runtime) o impostarla su true .

BV non funziona affatto

Quando in realtà non funziona nulla di BV, anche non @Size , @Pattern , ecc., Allora dovresti verificare se non hai il seguente nel tuo modulo:

  

Dovresti quindi rimuoverlo (sarà solo per default kick in) o per disabled="false" .

Assicurati di utilizzare il Mojarra più recente

Quando BV non funziona ancora, verifica se non stai utilizzando una vecchia versione di Mojarra tra 2.2.3 e 2.2.6. Quelle versioni avevano un bug delegato per il caricamento delle classi che causava la presenza di Bean Validation su Tomcat e cloni per essere completamente invisibili. Questo è segnalato come problema Mojarra 3183 e risolto in Mojarra 2.2.7.

Ho avuto un problema simile e sono stato in grado di superare il problema includendo i seguenti tre vasi in lib web-inf . Basta aggiungere il jar di convalida dell’ibernazione e i jar richiesti come previsto nel file zip:

  • hibernate-validator-4.3.0.Final.jar
  • jboss-logging-3.1.0.CR2.jar
  • validation-api-1.0.0.GA.jar

Se ancora non riesce a convalidare anche dopo aver aggiunto i vasi sopra indicati, allora potresti aver perso l’aggiunta di un tag

   

nel file di configurazione di spring.