grails custom validation
TRANSCRIPT
Custom Validation
What is validation ?
● Business rules that constrain the valid values of a particular property in a
domain class
● For example
- A Person must never have an age that is less than zero
- Rules like these should be expressed clearly, and in only one place
Limitation to built-in validators
It is impossible to foresee every feasibledomain
model and every specific kind of validation
that an application might need
Limitation to built-in validators Cont...
• Forexample, Let'sconsider the case withPassword validator:
− should be minimum of specified length− should not contain any field from personal information(name, email,
date
of birth, contact no. etc)
− should use mix of alphabets, digits and special characters( a-z A-Z 0-9
$#@^&*)
− confirm password fieldmust match
Limitation to built-in validators Cont...
• Custom error message depending on the invalid data entered.
− Password must be 8 characters long
− Password should not contain your name
− confirm password do not match
− Weak password, use digits and special characters.
Example 1 (Built-in Validator)
class Employee{
String namestatic constraint ={
name(blank: false)
}
}
Using Custom Validator
class Employee{String namestatic constraint ={Name(validator: {//closure with one, two or three parameter//return value determines the validation//null or true to indicate that the value is valid// false to indicate an invalid value})}}
Validator Closure parameter
• A single or no parameter block receives the value
• A two-parameter block receives the value and object reference
• A three-parameter Closure receives the value, object reference and
the errors object
One Parameter Closure
class User {String loginstatic constraints
={ login(validator: {
// it contains new value for login fieldprintln propertyNameif (!it.startsWith('boba')) return ['invalid.bountyhunter']
})}
}
Two Parameter Closure
class User { String login String password
static constraints ={ password(validator: {newValue, obj ->
println newValue println obj.class.nameprintln obj.properties['login']if(obj.properties['login'
].contains(newValue
))return 'Error: Password contains login name'
})}}
Three Parameter Closure
class User { String login String password
static constraints ={
password(validator: {newValue, obj, err
->println newValue
//entered value for password
println obj.class.name //User println obj.properties['login'] //entered value
for login println err
if(obj.
properties['login'].contains(newValue
))return
'Error: Password contains login name'
})
}}
Validator Closure return value
• Null or true to indicate that the value is valid
• False to indicate an invalid value and use the
default message code
Validator Closure return value Cont...
• A string to indicate the error code to append to the "classname.propertName." string used to resolve the error message. If a field specific message cannot be resolved, the error code itself will be resolved allowing for global error messages
• A list containing a string as above, and then any number of arguments following it, which can be used as formatted message arguments indexed at 3 onwards. See grails-app/i18n/message.properties to see how the default error message codes use the arguments
Custom Error Message
• Error messages can be defined in
grails-app/i18n/message.properties
file in the following format :
errorcode=error message
• e.g.
custom.error=Error occured, property={0} class= {1}value= {2}arg1={3}
• Now you can return any of these error code whose corresponding
error message wil be rendered on views(<g:hasError....tag)
Custom Error Message Cont...
• In error messages you can use the following arguments that are passed
automatically:
−{0}for propertyName e.g. Login
− {1}for Domain class name e.g. class Employee
− {2}for value entered for the validation field
− {3}for 1st argument you pass along with errorcode−{4}for 2nd argument you pass with errorcode
And soon
Example with Custom Error
class User { String userId String password String password2static transients =['password2']static constraints ={
password(blank: false, nullable: false, size:5..20, validator:{password, obj ->
def password2 =obj.properties['password2']if(password2 ==null) return true /* skip matching password
validation(only important when setting/resetting pass) */
password2 ==password ? true : ['invalid.matchingpasswords']
})}}
Contact us
Our Office
Client Location
Click Here To Know More!
Have more queries on Grails? Talk to our GRAILS experts Now!
Talk To Our Experts
Here's how the world's biggest Grails team is building enterprise applications on Grails!