Bean Validation @NotNull, @NotBlank y @NotEmpty no funciona en JSF + Tomcat

Estoy usando anotaciones de Hibernate Validation en mi bean administrado JSF. Cuando uso @NotNull , @NotBlank o @NotEmpty , parece que no se activan de ninguna manera.

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

Ver:

    

¿Cómo es esto causado y cómo puedo resolverlo?

Introducción

Ya que no me dio ningún comentario sobre mi comentario con la pregunta qué contenedor está usando, eché un vistazo en su historial de preguntas para saber qué contenedores están usando todos. Hasta donde encontré solo a Tomcat . Así que, para esta respuesta, supongo que de hecho estás usando Tomcat como inicialmente lo imaginé al publicar el comentario.

Asegúrate de instalar todos los JAR

Tomcat no incluye ninguna API / implementación de validación de frijol JSR303. Debe descargarlo e instalarlo usted mismo. Que hayas comstackdo esas anotaciones significa que has eliminado correctamente el archivo hibernate-validator.jar (los nombres pueden diferir según la versión) en la carpeta /WEB-INF/lib de tu aplicación web. Que esas anotaciones a su vez no parezcan funcionar de ninguna manera solo puede significar que no leyó el readme.txt y / u olvidó agregar los archivos JAR de la carpeta /lib/required del archivo zip / tgz de la biblioteca de Hibernate Validator : slf4j-api.jar y validation-api.jar . El último es obligatorio para que las anotaciones realmente funcionen. Por lo tanto, para que Hibernate Validator funcione en Tomcat, necesita los siguientes JAR en webapp /WEB-INF/lib :

  • validation-api.jar (contiene la API abstracta y el escáner de anotaciones)
  • hibernate-validator.jar (contiene la implementación concreta)
  • slf4j-api.jar (solo para hacer que su registrador funcione también)

De esta forma, @NotBlank y @NotEmpty deben funcionar. El @NotNull merece una atención especial; los campos de entrada vacíos se reciben por defecto como cadenas vacías del cliente (navegador web) debido a la naturaleza de los parámetros de solicitud de HTTP. Las cadenas vacías no son lo mismo que null , por lo que la @NotNull nunca se activará de manera predeterminada. Sin embargo, JSF se puede configurar para interpretarlas como null simplemente agregando el siguiente parámetro de contexto a web.xml :

  javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL true  

De esta forma, @NotNull debe funcionar también.

BV funciona pero solo campos vacíos

Si todavía no funciona (es decir, ninguna de las 3 anotaciones funciona, pero otras como @Size(min=5) para una longitud mínima de 5 funciona bien), entonces es probable que tengas el siguiente parámetro de contexto en la web.xml también:

  javax.faces.VALIDATE_EMPTY_FIELDS false  

A continuación, debe eliminarlo (de forma predeterminada es auto , es decir, solo cuando se encuentre la API de validación de beans JSR303 en classpath en tiempo de ejecución) o establecerlo en true .

BV no funciona en absoluto

Cuando realmente no funciona nada de BV, tampoco @Size , @Pattern , etc., entonces debe verificar si no tiene lo siguiente en su forma:

  

A continuación, debe eliminarlo (se activará de forma predeterminada) o establecer disabled="false" .

Asegúrate de usar la Mojarra más reciente

Cuando BV todavía no funciona, luego verifique si no está usando una versión anterior de Mojarra entre 2.2.3 y 2.2.6. Esas versiones tenían un error de delegado de carga de clases que causaba que la Validación de Beans en Tomcat y los clones fueran completamente invisibles. Esto se informa como la edición de Mojarra 3183 y se corrigió en Mojarra 2.2.7.

Tuve un problema similar y pude superar el problema al incluir los tres jar inferiores en web-inf lib. Solo agregue el jarrón de validación de hibernación y los jar requeridos como se proporciona en el archivo zip:

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

Si aún no puede validar incluso después de agregar los tarros indicados anteriormente, es posible que se haya perdido la adición de la etiqueta

   

en el archivo de configuración de spring.