Prevent Grails 2.4.4 from accepting invalid dates

123 Views Asked by At

One of my co-workers has written an application in Grails 2.4.4 (I know, it's dated). One problem the app has is that you can enter a date like 2/31/2015 and it will be accepted as valid and will show up in your domain object as 3/3/2015 instead.

Is there any easy way to prevent this from happening using grails? Or do we instead have to rely on client side validation for this particular property?

Thanks.

1

There are 1 best solutions below

0
Emmanuel Rosa On BEST ANSWER

Assuming that Grails is using DateFormat to parse the date String, the issue is that it's using a lenient Calendar. For example, with lenient set to true (the default), the result is as you described:

import java.text.SimpleDateFormat

def sdf = new SimpleDateFormat('MM/dd/y')
assert sdf.parse('02/31/2015').toString() == 'Tue Mar 03 00:00:00 EST 2015'

But, if you change it to false, you'll get an exception for the same date:

sdf.lenient = false

try {
    sdf.parse('02/31/2015').toString() == 'Tue Mar 03 00:00:00 EST 2015'
} catch (java.text.ParseException ex) {
    // java.text.ParseException: Unparseable date: "02/31/2015"
    println 'Oops'
}

So to handle this validation in your controller, you can

  1. Create a command object.
  2. Have the command object accept the date as a String rather than a Date, and perform the date validation.
  3. Modify the controller action to use the command object instead of params. This may require modifying the GSP code as well.