2013-06-21 7 views
7

Ho una data (come stringa) inviata. Mi piacerebbe mappare questo a un oggetto comando. Mi sono guardato intorno un po 'e non ho trovato nessuna grande risorsa su come eseguire questa mappatura all'interno di un oggetto comando ad una data reale.bind date to command object in Grails

Se dovessi farlo nel controller stesso, potrei semplicemente fare quanto segue, tuttavia questo non mi permette di mappare facilmente il mio oggetto comando.

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

Per il mio oggetto di comando, la più vicina sono stato in grado di ottenere è quello di ignorare il getter e setter per l'oggetto data. Entrambi devono essere sovrascritti oppure il setter non viene utilizzato. Questo è quello che ho provato per la prima volta (imposta String to Date, ma ottieni la Data). Quindi questo non utilizza il setter:

@grails.validation.Validateable 
class TaskCreateCommand { 

    Date startDate 


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

} 

Questo non dà alcun problema di runtime, ma è inutile perché non riesco a tirare fuori l'oggetto data effettiva.

@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

La risposta è stata utile? – dmahapatro

risposta

6

Co-incidentalmente stavo guardando lo stesso problema di oggi, e seguii this risposta da @Don. Sono stato in grado di associare correttamente una data all'oggetto comando.

@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, Come fa Grails a sceglierne uno se crei più 'CustomDateEditorRegistrar's? –

12

Se stai usando Grails 2.3 o versione successiva, è possibile aggiungere più formati di data personalizzato per l'associazione dati nel vostro Config.groovy

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

Poi, quando Grails tenta di associare i parametri di richiesta di comandare proprietà dell'oggetto, il tuo formato personalizzato verrà provato durante l'analisi della stringa di data nei parametri della richiesta es.

quindi quando si preme ad es.

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

si dovrebbe vedere qualcosa di simile ->

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

sulla tua console.

+0

Quale sarebbe il modo migliore di gestirlo per versioni di Grails precedenti alla 2.3? –

+0

Dovrai registrare il tuo editor di date personalizzato, che è un po 'più di lavoro. Dai un'occhiata a http://stackoverflow.com/questions/2871977/binding-a-grails-date-from-params-in-a-controller per i dettagli. Si espande un po 'di più su come farlo rispetto alla risposta accettata qui. – AndrewW

+0

È preferibile creare un ValueConverter da StringToDate in questo modo: http://stackoverflow.com/a/29552305/568179 (ed è a conoscenza delle impostazioni internazionali;)) – mpccolorado