Binding a Grails date from params in a controller
controller, data-binding, date, grails, groovy
Solution
Grails Version >= 2.3
A setting in `Config.groovy` defines the date formats which will be used application-wide when binding params to a `Date`
grails.databinding.dateFormats = [
'MMddyyyy', 'yyyy-MM-dd HH:mm:ss.S', "yyyy-MM-dd'T'hh:mm:ss'Z'"
]
The formats specified in `grails.databinding.dateFormats` will be attempted in the order in which they are included in the List.
You can override these application-wide formats for an individual command object using `@BindingFormat`
import org.grails.databinding.BindingFormat
class Person {
@BindingFormat('MMddyyyy')
Date birthDate
}
Grails Version < 2.3
i can't and will not belief that extracting the date by hand is nessesary!
Your stubbornness is rewarded, it has been possible to bind a date directly since long before Grails 1.3. The steps are:
(1) Create a class that registers an editor for your date format
import org.springframework.beans.PropertyEditorRegistrar
import org.springframework.beans.PropertyEditorRegistry
import org.springframework.beans.propertyeditors.CustomDateEditor
import java.text.SimpleDateFormat
public class CustomDateEditorRegistrar implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry registry) {
String dateFormat = 'yyyy/MM/dd'
registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true))
}
}
(2) Make Grails aware of this date editor by registering the following bean in `grails-app/conf/spring/resources.groovy`
beans = {
customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}
(3) Now when you send a date in a parameter named `foo` in the format `yyyy/MM/dd` it will automatically be bound to a property named `foo` using either:
myDomainObject.properties = params
or
new MyDomainClass(params)
Problem
Why is it so hard to extract the date from the view via the params in a grails controller? I don't want to extract the date by hand like this: ``` instance.dateX = parseDate(params["dateX_value"])//parseDate is from my helper class ``` I just want to use `instance.properties = params`. In the model the type is `java.util.Date` and in the params is all the information: `[dateX_month: 'value', dateX_day: 'value', ...]` I searched on the net and found nothing on this. I hoped that Grails 1.3.0 could help but still the same thing. I can't and will not believe that extracting the date by hand is necessary!