Binding di una data Grails da parametri in un controller

Perché è così difficile estrarre la data dalla vista tramite i parametri di un controller Grails?

Non voglio estrarre la data a mano in questo modo:

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

Voglio solo usare instance.properties = params .

Nel modello il tipo è java.util.Date e nei parametri sono tutte le informazioni: [dateX_month: 'value', dateX_day: 'value', ...]

Ho cercato in rete e non ho trovato nulla su questo. Speravo che Grails 1.3.0 potesse essere d’aiuto ma ancora la stessa cosa.

Non posso e non crederò che sia necessario estrarre la data a mano!

Versione Grails> = 2.3

Un’impostazione in Config.groovy definisce i formati di data che verranno utilizzati a livello di applicazione quando si associano parametri a una Date

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

I formati specificati in grails.databinding.dateFormats verranno tentati nell’ordine in cui sono inclusi nell’elenco.

Puoi sovrascrivere questi formati a livello di applicazione per un singolo object comando usando @BindingFormat

 import org.grails.databinding.BindingFormat class Person { @BindingFormat('MMddyyyy') Date birthDate } 

Versione Grails <2.3

Non posso e non crederò che estrarre la data a mano sia necessaria!

La tua testardaggine viene premiata, è stato ansible bind una data direttamente da molto prima di Grails 1.3. I passaggi sono:

(1) Creare una class che registri un editor per il formato della data

 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) Rendi Grails consapevole di questo editor di date registrando il seguente bean in grails-app/conf/spring/resources.groovy

 beans = { customPropertyEditorRegistrar(CustomDateEditorRegistrar) } 

(3) Ora quando si invia una data in un parametro denominato foo nel formato yyyy/MM/dd , verrà automaticamente associata a una proprietà denominata foo utilizza:

 myDomainObject.properties = params 

o

 new MyDomainClass(params) 

Grails 2.1.1 ha un nuovo metodo in params per un’analisi semplice e sicura.

 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') 

Trovalo in doc qui

Versione Grails> = 3.x

È ansible impostare in application.yml i formati di data che seguono questa syntax:

 grails: databinding: dateFormats: - 'dd/MM/yyyy' - 'dd/MM/yyyy HH:mm:ss' - 'yyyy-MM-dd HH:mm:ss.S' - "yyyy-MM-dd'T'hh:mm:ss'Z'" - "yyyy-MM-dd HH:mm:ss.S z" - "yyyy-MM-dd'T'HH:mm:ssX" 

Hai provato a utilizzare uno dei plug-in di selezione data di Grails?

Ho avuto buone esperienze con il plugin del calendario .

(Quando si utilizza il plug-in del calendario) Quando si invia la richiesta della selezione della data, è ansible associare automaticamente il parametro della query all’object dominio che si desidera popolare con la richiesta.

Per esempio

 new DomainObject(params) 

Puoi anche analizzare una stringa di date “yyyy / MM / dd” in questo modo …

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

@Don Grazie per la risposta sopra.

Ecco un’alternativa all’editor personalizzato che controlla l’ora della prima data e il formato della data.

Groovy, aggiungi nuovamente i due punti due per 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) : "") } } 

Versione Grails> = 2.3

Una versione localeAware per convertire le stringhe fino ad oggi

In src / groovy:

 package test import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest import org.grails.databinding.converters.ValueConverter import org.springframework.context.MessageSource import org.springframework.web.servlet.LocaleResolver import javax.servlet.http.HttpServletRequest import java.text.SimpleDateFormat class StringToDateConverter implements ValueConverter { MessageSource messageSource LocaleResolver localeResolver @Override boolean canConvert(Object value) { return value instanceof String } @Override Object convert(Object value) { String format = messageSource.getMessage('default.date.format', null, "dd/MM/yyyy", getLocale()) SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format) return simpleDateFormat.parse(value) } @Override Class< ?> getTargetType() { return Date.class } protected Locale getLocale() { def locale def request = GrailsWebRequest.lookup()?.currentRequest if(request instanceof HttpServletRequest) { locale = localeResolver?.resolveLocale(request) } if(locale == null) { locale = Locale.default } return locale } } 

In conf / spring / resources.groovy:

 beans = { defaultDateConverter(StringToDateConverter){ messageSource = ref('messageSource') localeResolver = ref('localeResolver') } } 

Il nome del bean ‘defaultDateConverter’ è molto importante (per sovrascrivere il convertitore di date predefinito)