【问题标题】:bind date to command object in Grails将日期绑定到 Grails 中的命令对象
【发布时间】:2013-06-18 23:29:29
【问题描述】:

我有一个日期(作为字符串)正在提交。我想将此映射到命令对象。我环顾四周,发现没有很好的资源来说明如何在命令对象中将此映射到实际日期。

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

def endDate = params.date('endDate', 'MM/dd/yyyy')

对于我的命令对象,我能得到的最接近的是覆盖日期对象的 getter 和 setter。两者都需要被覆盖,否则不使用设置器。这是我第一次尝试的(将字符串设置为日期,但获取日期)。所以这不使用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()
    }
}

【问题讨论】:

  • 这个答案有帮助吗?

标签: grails binding command-objects


【解决方案1】:

如果您使用的是 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
}

然后当你打例如。

http://localhost:8080/myController/myAction?date=12/13/2013

你应该看到类似 ->

Fri Dec 13 00:00:00 EST 2013
class java.util.Date

在您的控制台上。

【讨论】:

  • 对于 2.3 之前的 Grails 版本,处理此问题的最佳方法是什么?
  • 您必须注册自己的自定义日期编辑器,这需要更多的工作。详情请查看stackoverflow.com/questions/2871977/…。它比这里接受的答案更多地扩展了如何做到这一点。
  • 最好从 StringToDate 创建一个 ValueConverter,如下所示:stackoverflow.com/a/29552305/568179(并且它是区域设置感知的;))
【解决方案2】:

顺便说一句,我今天也在看同样的问题,并关注了@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

【讨论】:

  • Dhiraj,如果您创建多个CustomDateEditorRegistrars,Grails 如何选择一个?
【解决方案3】:

如果使用正确的@BindingFormat,对我有用。 示例:

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

【讨论】:

  • 我在 2013 年(6 年前)发布了这个问题,所以在较新的版本中可能会有更简单的方法。
猜你喜欢
  • 1970-01-01
  • 2015-12-12
  • 2011-08-06
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多