In this tutorial, we will learn how to add custom validation in the Grails application.
Grails domain classes support the validation by default. So we can simply add the constrains for the domain classes fields as below
class User {
String username
String password
String email
Integer age
static constraints = {
username blank: false, unique: true
password size: 5..15, blank: false
email email: true, blank: false
age min: 18
}
}
Now we can simply validate the object using validate() or hasErrors() methods
User user = new User(params) // map the request parameters to user object
if (!user.validate()) {
// format errors and send to the client
}
User user = new User(params) // map the request parameters to user object
if (user.hasErrors()) {
// format errors and send to the client
}
Now, let's say that we want to validate some non-domain fields or use a custom validation class to validate the request parameter sent by the user.
We can do so by implementing Validateable trait so that we can add the constrain for the fields in the custom class. Let's look into the example
import grails.validation.Validateable
class UserCommand implements Validateable {
public static final emailRegex = "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+\$"
UserCommand(def requestParams) {
email = requestParams.email
password = requestParams.password
username = requestParams.username
age = requestParams.age
}
static constraints = {
username blank: false, unique: true
password size: 5..15, blank: false
email email: true, blank: false, validator: emailValidator
age min: 18
}
static emailValidator = { String value, UserCommand command ->
if (!value.find(emailRegex)) {
return "email.invalid" // getting message from message.properties file
}
}
}
In the above example, we can add the constraints after implementing the Validateable on the custom class and do the validation logic similar to the domain classes validation.
Now, let's utilize the above command class inside the controller.
UserCommand userCommand = new UserCommand(requestParams)
if (!userCommand.validate()) {
Map result = [success: false, errors: []]
result.errors = getCommandErrors(userCommand)
render(result as JSON)
return
}
def messageSource
public static List getCommandErrors(def command) {
List errors = []
command.errors.allErrors.each { ObjectError error ->
String msg = messageSource.getMessage(error.code, error.arguments, error.defaultMessage)
errors.add(msg)
}
return errors
}
For more details visit Grails Validation