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.