我的一位同事在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'
}
因此,要在控制器中处理此验证,您可以使用
- 创建命令对象
- 让命令对象接受日期为
String
而不是Date
,并执行日期验证 - 修改控制器操作以使用命令对象而不是params。这可能还需要修改GSP代码