防止 Grails 2.4.4 接受无效日期
Prevent Grails 2.4.4 from accepting invalid dates
我的一位同事用 Grails 2.4.4 编写了一个应用程序(我知道,它已经过时了)。该应用程序存在的一个问题是您可以输入 2/31/2015 之类的日期,它将被接受为有效日期,并将在您的域对象中显示为 3/3/2015。
有什么简单的方法可以使用 grails 来防止这种情况发生吗?或者我们必须依赖客户端验证这个特定的 属性?
谢谢。
假设 Grails 使用 DateFormat to parse the date String
, the issue is that it's using a 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 编写了一个应用程序(我知道,它已经过时了)。该应用程序存在的一个问题是您可以输入 2/31/2015 之类的日期,它将被接受为有效日期,并将在您的域对象中显示为 3/3/2015。
有什么简单的方法可以使用 grails 来防止这种情况发生吗?或者我们必须依赖客户端验证这个特定的 属性?
谢谢。
假设 Grails 使用 DateFormat to parse the date String
, the issue is that it's using a 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 代码。