防止Grails 2.4.4接受无效日期



我的一位同事在Grails 2.4.4中编写了一个应用程序(我知道,它已经过时了)。该应用程序的一个问题是,您可以输入一个日期,如2015年2月31日,它将被视为有效,并将显示在您的域对象中,显示为2015年3月3日。

使用grails有什么简单的方法可以防止这种情况发生吗?还是我们必须依赖客户端验证这个特定属性?

谢谢。

假设Grails使用DateFormat解析日期String,问题是它使用了宽松的Calendar。例如,将宽大设置为true(默认值),结果如下所述:

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'

但是,如果你把它改为false,你会在同一日期得到一个例外:

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'
}

因此,要在控制器中处理此验证,您可以使用

  1. 创建命令对象
  2. 让命令对象接受日期为String而不是Date,并执行日期验证
  3. 修改控制器操作以使用命令对象而不是params。这可能还需要修改GSP代码

最新更新