我提交了一个日期(作为字符串)。我想将它映射到命令对象。我已经看了很多,并没有找到关于如何在命令对象中实现这种映射到真实日期的很好的资源。
如果我在控制器本身中执行此操作,我可以执行以下操作,但这不允许我轻松映射到我的命令对象。
def endDate = params.date('endDate', 'MM/dd/yyyy')
对于我的命令对象,我能够得到的最接近的是覆盖日期对象的getter和setter。两者都需要被覆盖,否则不使用setter。这是我第一次尝试(将String设置为Date,但获取Date)。所以这不使用setter:
@grails.validation.Validateable
class TaskCreateCommand {
Date startDate
public void setStartDate(String dateStr){
this.start = Date.parse('MM/dd/yyyy', dateStr)
}
}
这不会给出任何运行时问题,但是没用,因为我无法提取实际的Date对象。
@grails.validation.Validateable
class TaskCreateCommand {
Date startDate
public void setStartDate(String dateStr){
this.start = Date.parse('MM/dd/yyyy', dateStr)
}
public String getStartDate(){
return start.toString()
}
}
答案 0 :(得分:12)
如果您使用的是Grails 2.3或更高版本,则可以在Config.groovy中为数据绑定添加多种自定义日期格式
grails.databinding.dateFormats = ["MM/dd/yyyy"]
然后当Grails尝试将请求参数绑定到Command对象属性时,在解析请求参数中的日期字符串时将尝试自定义格式,例如。
class MyController {
def myAction(MyCommandObject cmd) {
println cmd.date
println cmd.date.class
}
}
class MyCommandObject {
Date date
}
然后当你击中eg。
http://localhost:8080/myController/myAction?date=12/13/2013
你应该看到像 - >
这样的东西Fri Dec 13 00:00:00 EST 2013
class java.util.Date
在你的控制台上。
答案 1 :(得分:6)
顺便说一下,我今天也在看同样的问题,然后跟着来自@Don的this回答。我能够正确地将日期绑定到命令对象。
@Validateable
class BookCommand {
String name
Date pubDate
Integer pages
}
//Controller
def index(BookCommand cmd) {
println cmd.name
println cmd.pages
println cmd.pubDate
render "Done"
}
//src/groovy
class CustomDateEditorRegistrar implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry registry) {
String dateFormat = 'yyyy/MM/dd'
registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true))
}
}
//URL
http://localhost:8080/poc_commandObject/book?name=Test&pages=10&pubDate=2012/11/11
//Println
Test
10
Sun Nov 11 00:00:00 EST 2012
答案 2 :(得分:0)
如果使用正确的@BindingFormat为我工作。 示例:
import grails.databinding.BindingFormat
class DateRangeFilter {
String fieldName
@BindingFormat('yyyy-MM-dd')
Date from
@BindingFormat('yyyy-MM-dd')
Date to
}