grails binding command-objects

fecha de enlace al objeto de comando en Grails



binding command-objects (2)

Casualmente estaba viendo el mismo problema hoy, y seguí esta respuesta de @Don. Pude vincular una fecha correctamente al objeto de 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

Tengo una fecha (como una cadena) que se envía. Me gustaría asignar esto a un objeto de comando. He buscado bastante y no encontré ningún recurso excelente sobre cómo hacer esta asignación dentro de un objeto de comando a una fecha real.

Si tuviera que hacer esto en el controlador mismo, podría hacer lo siguiente, sin embargo, esto no me permite mapear fácilmente en mi objeto de comando.

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

Para mi objeto de comando, lo más cercano que he podido obtener es anular el getter y el setter para el objeto de fecha. Ambos necesitan ser anulados o de lo contrario el setter no se usa. Esto es lo que probé por primera vez (establecer la cadena hasta la fecha, pero obtener la fecha). Entonces esto no usa el setter:

@grails.validation.Validateable class TaskCreateCommand { Date startDate public void setStartDate(String dateStr){ this.start = Date.parse(''MM/dd/yyyy'', dateStr) } }

Esto no da ningún problema de tiempo de ejecución, pero es inútil porque no puedo extraer el objeto Fecha real.

@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() } }


Si está utilizando Grails 2.3 o posterior, puede agregar varios formatos de fecha personalizados para el enlace de datos en su Config.groovy

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

Entonces, cuando Grails intente vincular los parámetros de solicitud a las propiedades del objeto Comando, se intentará su formato personalizado al analizar la cadena de fecha en los parámetros de solicitud, p. Ej.

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

luego cuando golpeas, por ej.

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

Deberías ver algo como ->

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

en tu consola.