I am using Hibernate Validation annotations in my JSF managed bean. When I use @NotNull
, @NotBlank
or @NotEmpty
they doesn't seem to be triggered in any way.
@NotBlank(message = "{name.required}") public String name;
View:
<h:outputLabel value="Name:" /> <h:inputText id="name" value="#{person.name}" size="20" /> <h:message for="name" style="color:red" />
How is this caused and how can I solve it?
@NotNull : The CharSequence, Collection, Map or Array object is not null, but can be empty. @NotEmpty : The CharSequence, Collection, Map or Array object is not null and size > 0. @NotBlank : The string is not null and the trimmed length is greater than zero.
The @NotNull annotation is, actually, an explicit contract declaring that: A method should not return null. Variables (fields, local variables, and parameters) cannot hold a null value.
@NotNull: a constrained CharSequence, Collection, Map, or Array is valid as long as it's not null, but it can be empty. @NotEmpty: a constrained CharSequence, Collection, Map, or Array is valid as long as it's not null, and its size/length is greater than zero.
Note that since Hibernate 5, Hibernate deprecated several of its specific validation constraint classes in favor to standard JSR 380-bean validation classes. Note also that the Hibernate Validator 6 library is actually the reference implementation of this JSR.
Since you didn't give any feedback on my comment with the question what container you're using, I peeked around in your question history to learn what containers you're all using. As far I found only Tomcat. So I'll for this answer assume that you're indeed using Tomcat as I initially guessed while posting the comment.
Tomcat does not ship with any JSR303 Bean Validation API/implementation out the box. You need to download and install it yourself. That you got those annotations to compile means that you've correctly dropped the hibernate-validator.jar
file (naming may differ per version) in /WEB-INF/lib
folder of your webapp. That those annotations in turn does not seem to work in any way can only mean that you didn't read the readme.txt
and/or forgot to add the JARs from the /lib/required
folder of the Hibernate Validator library zip/tgz file: slf4j-api.jar
and validation-api.jar
. The last one is mandatory in order to get the annotations to actually work. So, to get Hibernate Validator to work in Tomcat, you need the following JARs in webapp's /WEB-INF/lib
:
validation-api.jar
(contains the abstract API and the annotation scanner)hibernate-validator.jar
(contains the concrete implementation)slf4j-api.jar
(just to get its logger to work as well)This way @NotBlank
and @NotEmpty
must work. The @NotNull
deserves special attention; empty input fields are namely by default received as empty strings from the client (webbrowser) due to the nature of HTTP request parameters. Empty strings are not the same as null
, so the @NotNull
will by default never kick in. JSF is however configureable to interpret them as null
by just adding the following context parameter to web.xml
:
<context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param>
This way the @NotNull
must work as well.
If it still doesn't work (i.e. none of the 3 annotations work, but others like @Size(min=5)
for a minimum length of 5 works fine), then chances are big that you've the following context parameter in web.xml
as well:
<context-param> <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> <param-value>false</param-value> </context-param>
You should then remove it (it defaults to auto
, i.e. only when JSR303 Bean Validation API is found in runtime classpath) or to set it to true
.
When actually nothing of BV works, also not @Size
, @Pattern
, etc, then you should verify if you do not have the following in your form:
<f:validateBean disabled="true" />
You should then remove it (it will just by default kick in) or to set disabled="false"
.
When BV still doesn't work, then verify if you're not using an old Mojarra version between 2.2.3 and 2.2.6. Those versions had a classloading delegate bug causing Bean Validation on Tomcat and clones to be completely invisible. This is reported as Mojarra issue 3183 and fixed in Mojarra 2.2.7.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With