40 votes

Lier une date Grails à partir de paramètres dans un contrôleur

Pourquoi est-il si difficile d'extraire la date de la vue via les paramètres dans un contrôleur Grails ?

Je ne veux pas extraire la date à la main comme ça :

instance.dateX = parseDate(params["dateX_value"])//parseDate is from my helper class

Je veux juste utiliser instance.properties = params .

Dans le modèle, le type est java.util.Date et dans les paramètres se trouvent toutes les informations : [dateX_month: 'value', dateX_day: 'value', ...]

J'ai cherché sur le net et je n'ai rien trouvé à ce sujet. J'espérais que Grails 1.3.0 pourrait m'aider mais toujours la même chose.

Je ne peux pas et ne veux pas croire que l'extraction de la date à la main est nécessaire !

86voto

Dónal Points 61837

Version de Grails >= 2.3

Un décor en Config.groovy définit les formats de date qui seront utilisés dans l'ensemble de l'application lors de la liaison des paramètres à un fichier de type Date

grails.databinding.dateFormats = [
        'MMddyyyy', 'yyyy-MM-dd HH:mm:ss.S', "yyyy-MM-dd'T'hh:mm:ss'Z'"]

Les formats spécifiés dans grails.databinding.dateFormats seront tentés dans l'ordre dans lequel ils figurent sur la liste.

Vous pouvez remplacer ces formats d'application pour un objet de commande individuel à l'aide de la fonction @BindingFormat

import org.grails.databinding.BindingFormat

class Person { 
    @BindingFormat('MMddyyyy') 
    Date birthDate 
}

Version de Grails < 2.3

je ne peux pas et ne veux pas croire qu'extraire la date à la main est nécessaire !

Votre obstination est récompensée, il est possible de lier directement une date depuis bien avant Grails 1.3. Les étapes sont les suivantes :

(1) Créer une classe qui enregistre un éditeur pour votre format de date

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) Faites connaître à Grails cet éditeur de date en enregistrant le bean suivant dans le fichier grails-app/conf/spring/resources.groovy

beans = {
    customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}

(3) Maintenant, lorsque vous envoyez une date dans un paramètre nommé foo dans le format yyyy/MM/dd il sera automatiquement lié à une propriété nommée foo en utilisant l'un ou l'autre :

myDomainObject.properties = params

ou

new MyDomainClass(params)

14voto

Kumar Sambhav Points 751

Grails 2.1.1 a une nouvelle méthode dans les paramètres pour faciliter l'analyse syntaxique sans risque de nullité.

def val = params.date('myDate', 'dd-MM-yyyy')
// or a list for formats
def val = params.date('myDate', ['yyyy-MM-dd', 'yyyyMMdd', 'yyMMdd']) 
// or the format read from messages.properties via the key 'date.myDate.format'
def val = params.date('myDate')

Trouvez-le dans doc aquí

2voto

tinny Points 1718

Avez-vous essayé d'utiliser l'un des plugins Grails de sélection de date ?

J'ai eu de bonnes expériences avec le plugin de calendrier .

(Lorsque vous utilisez le plugin de calendrier) Lorsque vous soumettez la demande de sélection de date, vous pouvez automatiquement lier le paramètre de requête à l'objet de domaine que vous souhaitez remplir avec la demande.

Par exemple

new DomainObject(params)

Vous pouvez également analyser une chaîne de date "yyyy/MM/dd" comme suit...

new Date().parse("yyyy/MM/dd", "2010/03/18")

2voto

chim Points 1799

@Don Merci pour la réponse ci-dessus.

Voici une alternative à l'éditeur personnalisé qui vérifie d'abord la date et l'heure puis le format de la date.

Groovy, il suffit de rajouter des points-virgules pour java.

import java.text.DateFormat
import java.text.ParseException
import org.springframework.util.StringUtils
import java.beans.PropertyEditorSupport

class CustomDateTimeEditor extends PropertyEditorSupport {
    private final java.text.DateFormat dateTimeFormat
    private final java.text.DateFormat dateFormat
    private final boolean allowEmpty

    public CustomDateTimeEditor(DateFormat dateTimeFormat, DateFormat dateFormat, boolean allowEmpty) {
        this.dateTimeFormat = dateTimeFormat
        this.dateFormat = dateFormat
        this.allowEmpty = allowEmpty
    }

    /**
     * Parse the Date from the given text, using the specified DateFormat.
     */
    public void setAsText(String   text) throws IllegalArgumentException   {
        if (this.allowEmpty && !StringUtils.hasText(text)) {
            // Treat empty String as null value.
            setValue(null)
        }
        else {
            try {
                setValue(this.dateTimeFormat.parse(text))
            }
            catch (ParseException dtex) {
                try {
                    setValue(this.dateFormat.parse(text))
                }
                catch ( ParseException dex ) {
                    throw new IllegalArgumentException  ("Could not parse date: " + dex.getMessage() + " " + dtex.getMessage() )
                }
            }
        }
    }

    /**
     * Format the Date as String, using the specified DateFormat.
     */
    public String   getAsText() {
        Date   value = (Date) getValue()
        return (value != null ? this.dateFormat.format(value) : "")
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X