2013-06-21 1 views
7

У меня есть дата (как строка). Я хотел бы сопоставить это с объектом команды. Я немного оглянулся и не нашел большого ресурса о том, как сделать это сопоставление в пределах объекта команды с реальной датой.привязать дату к команде объекта в Grails

Если бы я должен был сделать это в самом контроллере, я мог бы просто сделать следующее, однако это не позволяет мне легко отобразить в свой объект команды.

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

Для моего объекта команды, ближе всего я был в состоянии получить это переопределить геттер и сеттер для объекта даты. Оба должны быть переопределены, иначе сеттер не будет использоваться. Это то, что я впервые попробовал (установите String to Date, но получите Date). Так что это не использует сеттер:

@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

Co-кстати, я смотрел на той же самой проблемой сегодня, и последовал this ответ от @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 
+0

Dhiraj, Как Grails выбирает один, если вы создаете несколько 'CustomDateEditorRegistrar'? –

12

Если вы используете Grails 2.3 или более поздней версии, вы можете добавить несколько пользовательские форматы дат для связывания данных в вашем Config.groovy

grails.databinding.dateFormats = ["MM/dd/yyyy"] 

Затем, когда Grails пытается связать параметры запроса к командованию свойства объекта, ваш пользовательский формат будет проверяться при анализе даты String в параметрах запроса, например.

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

Что было бы лучшим способом справиться с этим для версий Grails раньше 2.3? –

+0

Вам нужно будет зарегистрировать свой собственный редактор дат, который немного больше работает. За подробной информацией обратитесь к http://stackoverflow.com/questions/2871977/binding-a-grails-date-from-params-in-a-controller. Он расширяет немного больше о том, как это сделать, чем принятый ответ здесь. – AndrewW

+0

Лучше создать ValueConverter из StringToDate следующим образом: http://stackoverflow.com/a/29552305/568179 (и это знание локали;)) – mpccolorado