将日期绑定到Grails中的命令对象

将日期绑定到Grails中的命令对象,grails,binding,command-objects,Grails,Binding,Command Objects,我有一个日期(作为字符串)正在提交。我想把它映射到一个命令对象。我环顾了很多地方,并没有发现关于如何在命令对象中映射到真实日期的有用资源 如果我在控制器本身中执行此操作,我可以执行以下操作,但是这不允许我轻松映射到命令对象中 def endDate = params.date('endDate', 'MM/dd/yyyy') @Validateable class BookCommand { String name Date pubDate Integer pages

我有一个日期(作为字符串)正在提交。我想把它映射到一个命令对象。我环顾了很多地方,并没有发现关于如何在命令对象中映射到真实日期的有用资源

如果我在控制器本身中执行此操作,我可以执行以下操作,但是这不允许我轻松映射到命令对象中

def endDate = params.date('endDate', 'MM/dd/yyyy')
@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
对于我的命令对象,我能得到的最接近的方法是覆盖日期对象的getter和setter。两者都需要重写,否则将不使用setter。这是我第一次尝试的(将字符串设置为Date,但获取日期)。所以这不使用setter:

@grails.validation.Validateable
class TaskCreateCommand {

    Date startDate


    public void setStartDate(String dateStr){
        this.start = Date.parse('MM/dd/yyyy', dateStr)
    }

}
这不会给运行时带来任何问题,但毫无用处,因为我无法提取实际的日期对象

@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()
    }
}

顺便说一句,我今天也在看同样的问题,并遵循了@Don的回答。我能够将日期正确地绑定到命令对象

def endDate = params.date('endDate', 'MM/dd/yyyy')
@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

如果您使用的是Grails2.3或更高版本,那么可以在Config.groovy中为数据绑定添加多个自定义日期格式

grails.databinding.dateFormats = ["MM/dd/yyyy"]
然后,当Grails尝试将请求参数绑定到命令对象属性时,将在解析请求参数中的日期字符串时尝试自定义格式,例如

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

在您的控制台上。

如果使用正确的@BindingFormat,对我来说很有效。 例如:

import grails.databinding.BindingFormat
class DateRangeFilter {
    String fieldName
    @BindingFormat('yyyy-MM-dd')
    Date from
    @BindingFormat('yyyy-MM-dd')
    Date to 
}

答案有用吗?对于早于2.3的Grails版本,处理这个问题的最佳方法是什么?您必须注册自己的自定义日期编辑器,这需要做更多的工作。查看详细信息。它比这里公认的答案更详细地介绍了如何实现它。最好像这样从StringToDate创建一个ValueConverter:(而且它是区域设置感知的;))Dhiraj,如果创建多个
CustomDateEditorRegistrar
s,Grails如何选择一个呢?我在2013年(6年前)发布了这个问题,因此,在新版本中可能有更简单的方法。