Eddard Stark
Eddard Stark

Reputation: 3595

Grails domain custom error messages

I am working in a grails application, I have many domains in the applications, more than 50! The error message generated are default, I have the following in my message.properties file

default.blank.message=Field "{0}" cannot be blank.

An example of my one of the domain class is as follows:

class Person {

    String firstName;
    String lastName;
    String middleName;
    Date dob;
    String gender;
    String religion;
    String nationality;
    String maritalStatus;

    Zone permAddZone;
    District permAddDistrict;
    String permAddVDC;
}

And so on, so when I leave a field, for example 'maritalStatus' the following error message shows up, 'Field "maritialStatus" cannot be blank.'. I also added the following to my message.properties file

person.maritialStatus=Maritial Status

But still I am getting the 'Field "maritialStatus" cannot be blank.' message. I also tried using I18n Templates Plugin, but as I have a lot of domain classes, modifying error message for all of them would be time consuming. So, what choices do I have or what am I doing wrong. Any help is appreciated.

Upvotes: 2

Views: 1501

Answers (2)

Chris
Chris

Reputation: 8109

In order to override the field label you need to override the key:

<package>.<domainclass>.<fieldname>.label

So in your case, try:

<package>.Person.martialStatus.label=Label

Upvotes: 1

Ian Roberts
Ian Roberts

Reputation: 122364

The appropriate message key to override is specified on the reference page for each constraint type. In the case of blank it's

com.example.Person.maritalStatus.blank=Marital status must not be blank

However this will be very time consuming and repetitive if you have many domains and many properties.

What you are asking for is instead a way to process the domain class property names in some way before they are inserted into the default messages. This isn't something Grails supports out of the box but I like a challenge... and I've found a surprisingly elegant way to implement it. My approach is the grails plugin available at https://github.com/ianroberts/recursive-messages and it works by extending the format string syntax to support placeholders of the form

default.blank.message=Field "{0,message,field.name.}" cannot be blank.

A placeholder {N,message,prefix} is resolved by prepending the given prefix to the usual placeholder replacement value and then treating the resulting string (field.name.maritalStatus in this example) as a no-argument message key, and looking that up in the usual way. Thus you could have different representations for different languages.

It has to be a plugin because it relies on a trick that works in a plugin's doWithSpring but doesn't work in an application's resources.groovy, to modify the definition of the default messageSource Spring bean.

Disclaimer: this was a quick fix, it hasn't been fully tested and could probably be implemented more efficiently.

Upvotes: 3

Related Questions