2013-06-21 30 views
7

我有一个日期(作为字符串)被提交。我想将其映射到一个命令对象。我已经环顾四周,发现没有很好的资源来说明如何在命令对象内将这种映射映射到真正的日期。将日期绑定到Grails中的命令对象

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

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() 
    } 
} 
+0

答案有帮助吗? – dmahapatro

回答

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 
+0

Dhiraj,如果您创建多个'CustomDateEditorRegistrar',Grails如何选择一个? –

12

如果你使用Grails 2.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 
} 

然后当你击中例如。

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

你应该看到类似 - 在控制台上>

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

+0

在2.3之前的Grails版本中,处理此问题的最佳方法是什么? –

+0

你将不得不注册自己的自定义日期编辑器,这是一个更多的工作。查看详细信息http://stackoverflow.com/questions/2871977/binding-a-grails-date-from-params-in-a-controller。它比这里接受的答案更多地扩展了如何做到这一点。 – AndrewW

+0

最好从StringToDate创建一个ValueConverter,像这样:http://stackoverflow.com/a/29552305/568179(它是区域意识;)) – mpccolorado