Binder une date en Grails

Grails est un framework web pour Groovy, qui facilite beaucoup l’écriture d’une appli web.

Le binding est une des facilités de Grails : disons qu’on ait un objet User, contenant les propriétés lastName, firstName et birthdayDate. Notre formulaire de création/édition d’utilisateurs aura les champs correspondants. Dans le controlleur, on peut remplir notre objet User en écrivant simplement :

1
bindData(user, params)

Mais pour binder la date birthdayDate, la map params doit avoir les champs birthdayDate, birthdayDate_year, birthdayDate_month, birthdayDate_day, birthdayDate_hour et enfin birthdayDate_minute. Ces champs sont automatiquement générés par la balise <g:datePicker /> fournie par Grails, mais dès qu’on n’utilise plus cette balise (date picker personnalisé, utilisation d’un input text classique…), il faut générer soi-même tous les champs. C’est beaucoup trop long, lourd et complétement inadapté.

Heureusement, on peut également indiquer à Grails d’autres façons de binder des objets en créant un PropertyEditorRegistrar. Cet objet “enregistre” différents types de conversion textobjet. Pour chaque type de conversion, on crée une classe étendant PropertyEditorSupport.
Concernant les dates, la classe CustomDateEditor est déjà présente dans le package de Spring, mais n’est pas “enregistrée” par défaut. Dans notre cas, il nous suffit donc d’enregistrer un CustomDateEditor.

1
2
3
4
5
6
7
8
9
public class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar{
    def messageSource

    @Override
    void registerCustomEditors(PropertyEditorRegistry propertyEditorRegistry) {
        propertyEditorRegistry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(messageSource.getMessage("dateFormat.day", null, "MM/dd/yyyy", LocaleContextHolder.locale)), true))
    }

}

Rien de bien compliqué ! Ce “convertisseur” gère même l’i18n (il faut donc ajouter une propriété dateFormat.day dans les fichiers messages.properties pour que le code ci-dessus fonctionne)

Il ne reste plus qu’à déclarer ce “registrar” en tant que bean, dans le fichier Configuration/spring/resources.groovy :

1
2
3
4
5
beans = {
    customPropertyEditorRegistrar(CustomPropertyEditorRegistrar){
        messageSource = ref('messageSource')
    }
}
VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share
Ce contenu a été publié dans Grails, Spring, avec comme mot(s)-clef(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire