防止 Grails 2.4.4 接受无效日期

Posted

技术标签:

【中文标题】防止 Grails 2.4.4 接受无效日期【英文标题】:Prevent Grails 2.4.4 from accepting invalid dates 【发布时间】:2016-02-10 12:21:05 【问题描述】:

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

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

谢谢。

【问题讨论】:

【参考方案1】:

假设 Grails 使用 DateFormat 来解析日期 String,问题是它使用了 lenient Calendar。例如,将 lenient 设置为 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'

所以要在你的控制器中处理这个验证,你可以

    创建command object。 让命令对象接受日期为String 而不是Date,并执行日期验证。 修改控制器动作以使用命令对象而不是参数。这可能还需要修改 GSP 代码。

【讨论】:

以上是关于防止 Grails 2.4.4 接受无效日期的主要内容,如果未能解决你的问题,请参考以下文章

防止无效日期在jdk6中转换为下个月的日期?

MySQL:防止“无法将MySQL日期/时间值转换为”系统日期时间;(无效Da)

spring JPA java.sql.Date 接受无效日期

ORA-01722: 无效的数字,但数据类型是日期,它不会以任何方式接受它

Wdatepicker日期控件的使用指南

iTunesConnect 无法接受邀请 - 无效年份