passing - Bean Validation @NotNull, @NotBlank y @NotEmpty no funciona en JSF+Tomcat
pass parameter to bean jsf (3)
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:
<h:outputLabel value="Name:" />
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />
¿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 compilado 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
:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
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:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>
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(min=5) , @Pattern
, etc., entonces debe verificar si no tiene lo siguiente en su forma:
<f:validateBean disabled="true" />
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.
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
<mvc:annotation-driven />
en el archivo de configuración de primavera.
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