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 the Author

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

Comments

Leave a Reply

avatar
newest oldest most voted
Cannabisormurder
Guest
Cannabisormurder

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

Marc Bonet
Guest
Marc Bonet

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

?? ???
Guest
?? ???

Great! Thank you for wise article!

Eric St-Onge
Guest
Eric St-Onge

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

Srikanth
Guest
Srikanth

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
Guest
Jose

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

Saleh
Guest
Saleh
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… Read more »
Murugan Subbiah
Guest
Murugan Subbiah

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

Louise
Guest
Louise

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.

trackback
Proxy Servers » JSF – Addding custom validation messages is causing issue in loading css files from resources

[…] With the above configuration my app is working fine with i18n labels and able to load my custom.css file. Now i have to add custom validation messages and followed below link to add them. http://www.mkyong.com/jsf2/customize-validation-error-message-in-jsf-2-0/ […]

Andrejs82
Guest
Andrejs82

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

Raj
Guest
Raj

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
Guest
Louise

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
Guest
hector

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

suni
Guest
suni

You are my HERO!! Thanks :)

kshitij
Guest
kshitij

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.”

??????????
Guest
??????????

Thanks to the good things come to you.

Juan Carlos Vaca
Guest
Juan Carlos Vaca

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?

trackback
JSF 2.0 Tutorials

[…] Customize validation error message in JSF 2.0 How to customize validation error message in JSF 2.0. […]