grailsgrails-validation

Prevent Grails 2.4.4 from accepting invalid dates


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.


Solution

  • 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.