0% found this document useful (0 votes)
185 views

Spring MVC Form Validation With Annotations Tutorial - CodeTutr

The document discusses how to validate user-submitted form data in a Spring MVC application using JSR-303 validation annotations. It explains how to set up validation by adding validation dependencies and configuring Spring MVC, then annotating model fields and checking for errors in controllers. It also covers customizing validation error messages.

Uploaded by

Nilas Arcanister
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
185 views

Spring MVC Form Validation With Annotations Tutorial - CodeTutr

The document discusses how to validate user-submitted form data in a Spring MVC application using JSR-303 validation annotations. It explains how to set up validation by adding validation dependencies and configuring Spring MVC, then annotating model fields and checking for errors in controllers. It also covers customizing validation error messages.

Uploaded by

Nilas Arcanister
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

CodeTutr
JavaProgrammingTutorials

Home

Posts

About

HomeSpringSpringMVCFormValidationwithAnnotationsTutorial

SpringMVCForm
Validationwith
AnnotationsTutorial
PostedonMay28,2013bySteveHanson19Comments

Thistutorialwithfullsourcecodewillshowhowtovalidatea
formsubmissioninSpringMVCusingJSR303annotations.
YoucangrabthecodeforthistutorialonGitHubifyouwant
tofollowalong.

Sponsored

searchhere
Go

Recent
Posts

HelloAsciiDoc,
GoodbyeWord
Mavento
Gradle
Dependency
explainthebasicsofsettingupvalidationwithSpringMVC.
Converter
SpringMVC
Prerequisites:
Custom
Youshouldhaveabasicunderstandingofhowtosubmit
Validation
formsusingSpringMVC.Ifyoudonotalreadyunderstand
Annotations
SpringMVCbasics,followsomeofmyotherSpringtutorials
SpringMVC
first.
FormValidation
with
Letsbegin.Togetstarted,wefirstneedacoupleJARsin
Annotations
ourclasspath.AddtheJavavalidationAPIandtheHibernate
Tutorial
ValidatorimplementationJARs:.
SpringMVC
EasyREST
Gradle:
BasedJSON
compile'javax.validation:validationapi:1.1.0.Final'
Serviceswith
compile'org.hibernate:hibernatevalidator:5.0.1.Final'
@ResponseBody
Oneofthemostcommonelementsofwebapplicationsis
validationofuserdata.Anytimeausersubmitsdatainto
yoursystem,itneedstobevalidated.Thisistoprevent
attacks,baddata,andsimpleusererror.Thistutorialwill

http://codetutr.com/2013/05/28/springmvcformvalidation/

1/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

Or,ifyoureusingMaven:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validationapi</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernatevalidator</artifactId>
<version>5.0.1.Final</version>
</dependency>

TagCloud
ajaxasciidocbuildtool

gradle
hibernatevalidator jackson

java

jodatime

jsr303markdown
Next,makesureyouactivateSpring`annotationdriven`:

mavenREST servlet

springspringjavaconfig

JavaConfiguration:

springmvc

@Configuration
@EnableWebMVC//thisdoesthetrick
@ComponentScan(basePackages="com.codetutr")
publicclassWebConfig{
//beanshere
}

FollowMe

validationweb

XMLConfiguration:
<mvc:annotationdriven/>
Now,weannotateourmodelobjectwiththeconstraintswe
willbevalidating:
publicclassSubscriber{

@Size(min=2,max=30)
privateStringname;

@NotEmpty@Email
privateStringemail;

@NotNull@Min(13)@Max(110)
privateIntegerage;

@Size(min=10)
privateStringphone;

@NotNull
privateGendergender;

@DateTimeFormat(pattern="MM/dd/yyyy")
@NotNull@Past
privateDatebirthday;

...
}
AllofthevalidationsusedabovearepartoftheJSR303

Archives
December2013
September
2013
May2013
April2013
March2013
February2013

Categories
Gradle
Java
Maven
Programming
Spring

API,exceptforNotEmptyandEmail,whichare
HibernateValidatorannotations.
http://codetutr.com/2013/05/28/springmvcformvalidation/

2/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

Almostthere!Now,letstellourcontrollertovalidatethe
forminthesubmissionhandlermethod:

Meta

@Controller
Login
publicclassFormController{
EntriesR S S

...
CommentsR S S

WordPress.org
@RequestMapping(value="form",method=RequestMethod.POST)
publicStringsubmitForm(@ValidSubscribersubscriber,BindingResultresult,Model
if(result.hasErrors()){
return"formPage";
}

m.addAttribute("message","Successfullysavedperson:"
return"formPage";
}
}

Simplyadding`@Valid`tellsSpringtovalidatethe
Subscriberobject.Nice!Noticewealsoadda
BindingResultargument.ThisisSpringsobjectthatholds
theresultofthevalidationandbindingandcontainserrors
thatmayhaveoccurred.TheBindingResultmustcomeright
afterthemodelobjectthatisvalidatedorelseSpringwillfail
tovalidatetheobjectandthrowanexception.
WhenSpringsees@Valid,ittriestofindthevalidatorfor
theobjectbeingvalidated.Springautomaticallypicksup
validationannotationsifyouhaveannotationdriven
enabled.Springtheninvokesthevalidatorandputsany
errorsintheBindingResultandaddstheBindingResultto
theviewmodel.
Now,ourview:
<form:formaction="/form"modelattribute="subscriber"
<labelfor="nameInput">Name:</label>
<form:inputpath="name"id="nameInput"></form:input
<form:errorspath="name"cssclass="error"></form:errors
<br/>

<labelfor="ageInput">Age:</label>
<form:inputpath="age"id="ageInput"></form:input
<form:errorspath="age"cssclass="error"></form:errors
<br/>

<labelfor="phoneInput">Phone:</label>
<form:inputpath="phone"id="phoneInput"></form:input
<form:errorspath="phone"cssclass="error"></form:errors
<br/>

<labelfor="emailInput">Email:</label>
<form:inputpath="email"id="emailInput"></form:input
<form:errorspath="email"cssclass="error"></form:errors
<br/>
http://codetutr.com/2013/05/28/springmvcformvalidation/

3/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

<br/>

<labelfor="birthdayInput">Birthday:</label>
<form:inputpath="birthday"id="birthdayInput"
<form:errorspath="birthday"cssclass="error"></
<br/>

<labelfor="genderOptions">Gender:</label>
<form:selectpath="gender"id="genderOptions">
<form:optionvalue="">SelectGender</form:option
<form:optionvalue="MALE">Male</form:option
<form:optionvalue="FEMALE">Female</form:option
</form:select>
<form:errorspath="gender"cssclass="error"></
<br/>

<labelfor="newsletterCheckbox">Newsletter?</
<form:checkboxpath="receiveNewsletter"id="newsletterCheckbox"
<form:errorspath="receiveNewsletter"cssclass
<br/><br/>
<inputtype="submit"value="Submit"/>
</form:input></form:form>

Theform:errorstagoutputserrorsassociatedwiththe
specifiedpath.
Now,ifwefireupourappandsubmittheformblank,we
see:

Theformalsocorrectlyvalidatesthattheemailaddressisa
validformat,ageisbetween13and110,thephonenumber
isatleast10characterslongandbirthdayisinthepast.
Cool.Buttheerrormessagesareterrible!Howcanwe
customizethem?Theeasiest(thoughnotbest)wayisto
usetheannotationsmessageproperty,likeso:
@Size(min=10,message="Phonenumbermustbeatleast10characters"
http://codetutr.com/2013/05/28/springmvcformvalidation/

4/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

@Size(min=10,message="Phonenumbermustbeatleast10characters"

Thisisnice,butdoesnotsupportinternationalization.Plus,
dowereallywantourmessagesinourJavaobjects?
Fortunately,wecaneasilyoverridethedefaultmessagesin
ourmessagebundle.Todothis,firstsetupamessage
bundle:
JavaConfig:
@Bean
publicMessageSourcemessageSource(){
ResourceBundleMessageSourcemessageSource=new
messageSource.setBasename("messages");
returnmessageSource;
}
XMLConfig:

<beanid="messageSource"class="org.springframework.context.support.ResourceBundleMessa
<propertyname="basename"value="messages"/>
</bean>

Now,createafilecalledmessages.propertiesin
src/main/resources.Now,wecanoverridethedefaulterror
messages.Errormessagesareresolvedusingthefollowing
pattern:
{ValidationClass}.{modelObjectName}.{field}
Forexample,iftheagefieldofoursubscribermodelobject
failstheNotNullvalidation,theNotNull.subscriber.age
messagewouldbelookedup.Ifthemessageisntfound,
NotNull.subscriberwouldbelookedfor.Finally,ifnot
found,NotNullmessagewouldbelookedfor.Ifthatalso
isntfound,thedefaultmessage(whatwesawabove)would
berendered.Withthisconventioninmind,letsdefineour
errormessages:
Size=the{0}fieldmustbebetween{2}and{1}characterslong
Size.subscriber.name=Namemustbebetween{2}and{1}characters
Size.subscriber.phone=Phonemustbeatleast{2}characters

Min.subscriber.age=Youmustbeolderthan{1}
Max.subscriber.age=Sorry,youhavetobeyoungerthan{1}

Email=Emailaddressnotvalid
Past=Datemustbeinthepast

NotEmpty=Fieldcannotbeleftblank
NotNull=Fieldcannotbeleftblank

http://codetutr.com/2013/05/28/springmvcformvalidation/

5/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

typeMismatch=Invalidformat
methodInvocation.myRequest.amount=Invalidformat

Noticetheuseof{0},{1},etc.Theseareargumentsthatcan
bepassedintothemessage.Now,ifwerunourvalidations,
weshouldseenicermessages:

BeforeIsignout,quickusabilitynotethatisoutsidethe
scopeofthistutorial:usefrontendvalidationsalso!
Usersexpecttheconvenienceofimmediatelyknowingif
thereisanerror,sogoaheadandduplicatesomelogicon
thefrontend.
Thatwrapsupthistutorial.Checkoutmynexttutorialon
creatingcustomvalidationannotationstoseehowtoeasily
createvalidationannotationstofityournotsocookiecutter
situations.Istronglyrecommendyoudownloadthesource
andrunthecode.Postanyquestionsyouhaveinthe
http://codetutr.com/2013/05/28/springmvcformvalidation/

6/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

commentsbelow.
FullSource:ZIP,GitHub
Torunthecodefromthistutorial:MusthaveGradle
installed.ClonefromGitHubordownloadtheZIP.Extract.
Opencommandprompttoextractedlocation.Rungradle
jettyRunWar.Navigateinbrowsertohttp://localhost:8080.
References::
Spring3ValidationReference
Like

18

Tweet

Share

SpringMVCEasyRESTBasedJSONServiceswith
@ResponseBody
SpringMVCCustomValidationAnnotations
PostedinSpringTaggedwith:java,jsr303,springmvc,validation

Comments
Recommend

Community

Share

Login

SortbyBest

Jointhediscussion
avatar42 3yearsago

Toproperlyusecustomerrormessagesyouwill
wantusetheannotationlike:
@Size(min=10,message="
{Size.subscriber.phone}")
Thebracketssurroundingthekeyarerequiredto
makeitworkwhichIfoundunclearinmostofthe
examplesIfoundontheweb.Alsoyouwillneed
tolinkyourmessagesourcetothevalidatorlike
so:
<beanid=validator
class=org.springframework.validation.beanvalidation.LocalValidatorFactoryBean>
<propertyname=validationMessageSource
ref=messageSource/>
</bean>
<mvc:annotationdrivenvalidator=validator/>
10

Reply Share

http://codetutr.com/2013/05/28/springmvcformvalidation/

7/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

VikasGs 2yearsago

HiSteve,Nicepost!!
Itriedtofollowthestepsshowninyourexample,
buttheformvalidationjustdoesnothappen!
Thevalue"result.hasErrors()"isseenasfalse.
Anysuggestions?
4

Reply Share

sinak1 3yearsago

Igetmultipleerrorsforthevalidationpart.
ThefirstoneisforIntegervalidationfor"age"
field.Itsayssomethinglike:
"javax.validation.UnexpectedTypeException:
HV000030:Novalidatorcouldbefoundfortype:
java.lang.Integer....."
I'vemadesureageisoftypeIntegerandnotint.
thesecondoneIgetisforDatevalidation:
"Cannotconvertfromjava.lang.Stringtorequired
typejava.util.Dateforpropertybirthday"
nestedexceptionis
org.springframework.core.convert.ConversionFailedException:
Failedtoconvertfromtypejava.lang.Stringto
type"
Anysolutionsforthese?CouldIpossiblyhave
missedsomething?
Ialsonoticedwhenrunningtheapponbuiltin
jettyenginetheHibernatevalidationlibrarywould
complainaboutmissingslf4jjarfiles.SoIfixedit
byaddingthefollowingtobuild.gradlein
"dependencies"section:
compile'org.slf4j:slf4japi:1.6.4'
thanks!
4

Reply Share

SharadPawar>sinak1
8monthsago

addfollowingdependencyinyourpom.xml
<dependency>
<groupid>javax.validation</groupid>

http://codetutr.com/2013/05/28/springmvcformvalidation/

8/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

<groupid>javax.validation</groupid>
<artifactid>validationapi</artifactid>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupid>org.hibernate</groupid>
<artifactid>hibernatevalidator</artifactid>
<version>5.0.1.Final</version>
</dependency>

Reply Share

elnibs 3yearsago

JustatypogroupIdandartifactId(uppercase),
thxforthegreattutorials
1

Reply Share

SteveHanson
3yearsago

Mod >elnibs

Fixed.Thanks@elnibs,gladyouare
enjoyingthem!

Reply Share

Orionix 3yearsago

Awesomeexplanation!
Itisreallyhelpful.
Itisalsowouldbegreatideaifthecustom
validationcaseisexplained.Forexampleif
birthDateshouldn'tbelessthancertaindate,say
nolessthanyearof1900.
1

Reply Share

SteveHanson
3yearsago

Mod >Orionix

Gladitwashelpfultoyou!I'vealmost
finishedapostoncustomvalidation
annotations.Shouldhaveitupinafew
days.Feelfreetoletmeknowifthereare
anyotherpostsyouwouldliketoseeon
here.
EDIT7/9/13:

http://codetutr.com/2013/05/28/springmvcformvalidation/

9/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

EDIT7/9/13:
Customvalidationtutorialnowavailable:
http://codetutr.com/2013/05/29...
1

Reply Share

SharadPawar 8monthsago

FacingErroratGendermembervariableinmodel
class

Reply Share

AlabamaMothman ayearago

Isthereanywaytoputthe(forexample)@size
minandmaxinaconfigbean?
(PosteditIt'sweirdthetextdoesntappearasIve
typedit)...
Forexample:(
<beanid="size"
class="org.javax.valilidate.sizeclass"property=""
name="min"value="18"property=""name="max"
value="150"/>

Reply Share

Sasha ayearago

whydoweneedbothhibernatevalidatorand
javaxvalidator?

Reply Share

StanS.Stanman 2yearsago

Greattutorial,veryhelpful!Iparticularlylikethat
you'veincludedbothJavaConfigandXMLconfig
IuseJavaConfigexclusivelyandsomanysites
provideonlytheXMLconfig.

Reply Share

Arun 2yearsago

Howcanivalidateafieldwhichcanbeemptyorif
givenpropervalue(likeemailormobilenumber)
howtogowiththat

Reply Share

GuidoCelada 2yearsago

checkthecaseinmodelAttributeforform:form

Reply Share

DiogoMiranda 2yearsago

GreatexplanationSteve,isitpossiblevalidatea

http://codetutr.com/2013/05/28/springmvcformvalidation/

10/11

12/5/2016

SpringMVCFormValidationwithAnnotationsTutorialCodeTutr

GreatexplanationSteve,isitpossiblevalidatea
Calendarattribute?

Reply Share

Guest 3yearsago

Ihavedonewhatyousaid,speciallyI'musing
@Emailannotation,butwhenIsubmittheformI
getanexceptionfromhibernate
Listofconstraintviolations:[
ConstraintViolationImpl{interpolatedMessage='not
awellformedemailaddress',
propertyPath=correo,rootBeanClass=class
com.blah.baseProject.database.model.Usuario,
messageTemplate='{org.hibernate.validator.constraints.Email.message}'}
]]
anyclue?
Nicetutorialbtw.

2016CodeTutr

http://codetutr.com/2013/05/28/springmvcformvalidation/

ResponsiveThemepoweredby
WordPress

11/11

You might also like