防止Grails 2.4.4接受无效日期

时间:2015-11-09 18:55:45

标签: grails grails-validation

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

有没有简单的方法可以防止使用Grails发生这种情况?或者我们是否必须依赖客户端验证这个特定的属性?

感谢。

1 个答案:

答案 0 :(得分:2)

假设Grails使用DateFormat来解析日期Calendar,问题在于它使用了lenient 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' 。例如,将lenient设置为true(默认值),结果如下所述:

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

但是,如果您将其更改为false,则会在同一日期获得例外:

String

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

  1. 创建command object
  2. 让命令对象接受Date而不是boolean activityIsOpen = false; 的日期,然后执行日期验证。
  3. 修改控制器操作以使用命令对象而不是params。这可能还需要修改GSP代码。