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

Sco*_*ott 7 grails binding command-objects

我提交了一个日期(作为字符串).我想将它映射到命令对象.我已经看了很多,并没有发现如何在命令对象中实现这种映射到实际日期的很好的资源.

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

def endDate = params.date('endDate', 'MM/dd/yyyy')
Run Code Online (Sandbox Code Playgroud)

对于我的命令对象,我能够得到的最接近的是覆盖日期对象的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)
    }

}
Run Code Online (Sandbox Code Playgroud)

这不会给出任何运行时问题,但是没用,因为我无法提取实际的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()
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ewW 12

如果您使用的是Grails 2.3或更高版本,则可以在Config.groovy中为数据绑定添加多种自定义日期格式

grails.databinding.dateFormats = ["MM/dd/yyyy"]
Run Code Online (Sandbox Code Playgroud)

然后,当Grails尝试将请求参数绑定到Command对象属性时,将在解析请求参数中的日期字符串时尝试自定义格式,例如.

class MyController {
    def myAction(MyCommandObject cmd) {
        println cmd.date
        println cmd.date.class
    }
}

class MyCommandObject {
    Date date
}
Run Code Online (Sandbox Code Playgroud)

然后当你击中eg.

http://localhost:8080/myController/myAction?date=12/13/2013
Run Code Online (Sandbox Code Playgroud)

你应该看到类似的东西 - >

Fri Dec 13 00:00:00 EST 2013
class java.util.Date
Run Code Online (Sandbox Code Playgroud)

在你的控制台上.


dma*_*tro 6

共顺便我今天在看同样的问题,其次从@Don答案.我能够正确地将日期绑定到命令对象.

@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
Run Code Online (Sandbox Code Playgroud)