Navein Fernandes
Navein Fernandes

Reputation: 21

Override Grails Error Messages to format Dates and Numbers

I have created a domain with a Double field. When the validation occurs it throws the error message with size value showing the number with commas. Following are the detials

Groovy Class

class Quote {

    String content;
    Double size;

    static constraints = {
       content(maxSize:1000, blank:false)
       size(min: 0.00D, max:999.99D)
    }
}

Value entered "11111", error obtained "Size 11,111 is exceeded the limit". I have added the property key/value pair in messages.properties.

Here, I would like to get the message back without the commas. My main aim is to take the key and format the message returned based on my requirements. I require this as I have other fields that need conversion. For example, a date is validated but when showing the error the Gregorian date needs to be converted to an Islamic date and shown to user.

Does anyone know if I can do something to make this work.

I have tried the solution provided in http://ishanf.tumblr.com/post/434379583/custom-property-editor-for-grails but this did not work. I have also tried modifying the messages values, but this is not flexible in case of my date issue. Example, for a key value pair, instead of using {2} as a place holder I could use {2, date, mm/dd/yyyy}, but for Islamic dates I want to format and show things differently.

Also, please note I have created a separate key for default date formatting for my application.

Would appreciate the help.

Upvotes: 2

Views: 861

Answers (1)

Eduard
Eduard

Reputation: 3671

In grails, the return of a constrain is an already translated string.

You can create a taglib to format that, or enhance the

Another option would be custom validators. A custom validator can return false or a key when failing.

For example in your domain class, to vaildate a field:

myDateField validator: {val, obj -> obj.myShinyDateValidatorMethod(val) }

private myShinyDateValidatorMethod() {
  if (isNotValidDate(val) {
    return [the_message_key, val.formatedAsYouWand]
  }
}

and, in your properties file you have to have defined the key:

the_message_key=This date: {3} is not valid

The trick here is that in the return from the validator, first string is the key and the rest are parameters for that key, but grails already uses {0}, {1}, {2} placeholders for className, fieldName and value, and the first parameter that you pass will be used as {3} placeholder.

Hope this helps

Upvotes: 1

Related Questions