Main Tutorials

Customize validation error message in JSF 2.0

The standard JSF conversion and validation error messages are too detail, technical or sometime, not really human readable. In this article, it shows you how to customize standard conversion or validation error message in JSF 2.0.

Summary Guide

  1. Find your message key from jsf-api-2.x.jar, “Messages.properties” file.
  2. Create your own properties file, and put the same message key you found in above “Messages.properties” file, and override it with your custom error message.
  3. Register your properties file in “faces-config.xml”, put it as application level.
  4. Done.

1. Messages.properties

All JSF standard conversion and validation error messages are stored in “Messages.properties” file, which can be located from jsf-api-2.x.jar, “javax\faces\Messages.properties“, see figure below :

jsf2-Custom-Validation-Error-Example-1

See portion of this “Messages.properties” file


...
# ===================================================================
# Converter Errors
# ===================================================================
javax.faces.converter.DateTimeConverter.DATE={2}: ''{0}'' could not be understood as a date.
javax.faces.converter.DateTimeConverter.DATE_detail={2}: ''{0}'' could not be understood as a date. Example: {1} 
...
# ====================================================================
# Validator Errors
# ====================================================================
javax.faces.validator.LengthValidator.MAXIMUM={1}: Validation Error: Length is greater than allowable maximum of ''{0}''
javax.faces.validator.LengthValidator.MINIMUM={1}: Validation Error: Length is less than allowable minimum of ''{0}''
...

For example,
1. <f:validateLength minimum=”5″ maximum=”10″ />
If maximum length validation failed, JSF gets “javax.faces.validator.LengthValidator.MAXIMUM”.
If minimum length validation failed, JSF gets “javax.faces.validator.LengthValidator.MINIMUM”.

2. <f:convertDateTime pattern=”d-M-yyyy” />
If date validation failed, JSF gets “javax.faces.converter.DateTimeConverter.DATE_detail”.

Note
If you do not sure which key match to which validator tag, just display the error message once and compare it with “Messages.properties”, then you will know which key you want to override.

2. Custom Error Message

Create a properties file named “MyMessage.properties” (can be any name you like), put message key and custom error message inside. Later, put this properties file into your project resources folder.

MyMessage.properties


javax.faces.converter.DateTimeConverter.DATE={2}: ''{0}'' could not be understood as a date.
javax.faces.converter.DateTimeConverter.DATE_detail=Invalid date format.

javax.faces.validator.LengthValidator.MINIMUM=Minimum length of ''{0}'' is required.

Now, you are going to custom the validation error message for “javax.faces.validator.LengthValidator.MINIMUM” and conversion error message for “javax.faces.converter.DateTimeConverter.DATE_detail“.

Note
For the XXX_detail message key, you have to override its parent key (summary message) as well, which is XXX without the “_detail” behind; Otherwise, JSF will ignore your new custom error message and keep getting the standard error message from “Messages.properties”, may be this is a bug in JSF 2.0?

3. Register Message Bundle

Register your custom properties file in “faces-config.xml”, put it as Application level.

faces-config.xml


<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
     <application>
	  <message-bundle>
	  	com.mkyong.MyMessage
	  </message-bundle>
     </application>
</faces-config>

4. Demo

A JSF page, add both <f:validateLength /> and <f:convertDateTime /> validation.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      >
    <h:body>
    	
    	<h1>Customize validation error message in JSF 2.0</h1>
		
	<h:form>
		
		<h:panelGrid columns="3">
			
			Enter your username :
				
			<h:inputText id="username" value="#{user.username}" 
				size="20" required="true" label="Username">
				<f:validateLength minimum="5" maximum="10" />
			</h:inputText>
				
			<h:message for="username" style="color:red" />
				
			Enter your DOB :
				
			<h:inputText id="dob" value="#{user.dob}" 
				size="20" required="true" label="Date of Birth">
				<f:convertDateTime />
			</h:inputText>
				
			<h:message for="dob" style="color:red" />
				
		</h:panelGrid>
			
		<h:commandButton value="Submit" action="result" />
			
	</h:form>	
    </h:body>
</html>

When validation failed, display your custom error message now.

jsf2-Custom-Validation-Error-Example-2

Download Source Code

Reference

  1. JSF 2 & Resource Bundle

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
18 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Marc Bonet
6 years ago

Excellent article! Exactly what I was looking for.
Thanks!

Murugan Subbiah
11 years ago

I was looking for the exact blog. You rock. Thanks a lot.

Cannabisormurder
6 years ago

What does this mean @ x+ @p ??? Someone help please

?? ???
9 years ago

Great! Thank you for wise article!

Srikanth
10 years ago

javax.faces.converter.DateTimeConverter.DATE
javax.faces.converter.DateTimeConverter.DATE_detail

Both should be available .properties, only one of the property is not sufficient to override the default values

Jose
10 years ago

As always Thanks!!!!!!!!!!!!!!!!!!

Saleh
10 years ago

Mkyong:

I just want to mention something.

When I tried this tutorial I failed because of a little misconceiving regarding the file: project resources folder
>>”. Later, put this properties file into your project resources folder.”

I am using NetBeans and I thought it is “resources” (which can contain css files and others) and that causes the error message:
Can’t find bundle for base name message, locale en_US

So the correct place is in the “Source Packages” -> (NetBeans)

I Know that you use Eclipse where the equivalent is “Java Resources” and you meant that.

So I hope you to clarify it in a proper way.

Finally Thank you for the great tutorials.

Louise
11 years ago

Just a side note to any one maybe not seeing their messages right away: Keep in mind that the h:messages attribute is by default configured as showDetails=”true” and showSummary=”false”. When you only override the non-suffixed key (which is used for summary) this will have no visible effect. Either change the attributes on your message component or also override the key suffixed with _detail.

Andrejs82
11 years ago

I am just put into my project resource file like /javax/faces/Messages_ru.properties and everything working!

Raj
11 years ago

Can you please provide full list of keys that can be used.

like for when we use match attribute of primeface password control which Error Key’d message is displayed.

Louise
11 years ago
Reply to  Raj

You can look them up yourself. Both your JSF implementation and PrimeFaces come as a .jar-file. Somewhere inside there will be a Messages.properties file that contains all the keys. The standard JSF properties file looks like this:
http://svn.apache.org/repos/asf/myfaces/core/branches/2.0.x/api/src/main/resources/javax/faces/Messages.properties

hector
11 years ago

hello, I did all the steps and I get the custom message, I can be wrong?

suni
12 years ago

You are my HERO!! Thanks 🙂

kshitij
12 years ago

Hello Mk Yong

i have problem regarding to this error messages.

i have two languages in project.


         <h:outputText value="#{cm['username']}" />
         <p:inputText id="loginname" value="#{simpleLogin.loginname}" 
              label="Username" required="true" maxlength="30" />

when i am submitting form with null value then it is printing message like

“Username: Validation Error: Value is required.”

problem is it is also printing same text for turkish language.

How to get turkish text for “Username: Validation Error: Value is required.”

??????????
12 years ago

Thanks to the good things come to you.

Juan Carlos Vaca
12 years ago

Hi, I customized the validation messages in my app which uses icefaces 1.8. We did something like this javax.faces.component.UIInput.REQUIRED=. When an error is presente, it presents a little image, and using java script, on mouse over the image, a Bubble apears showing the errors.

Now I migrated my application to icefaces 20.2 and now the message errors is presented exatly as is defined in message bundle, The are escaped. Is there a way to avoid escape characters in icefaces 2.0?

Eric St-Onge
10 years ago

This is unnecessarily overly complicated. Using the validatorMessage attribute is MUCH simpler.