Привязка даты Grails из параметров в контроллере - PullRequest
39 голосов
/ 20 мая 2010

Почему так сложно извлечь дату из вида через параметры в контроллере grails?

Я не хочу извлекать дату вручную следующим образом:

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

Я просто хочу использовать instance.properties = params.

В модели тип java.util.Date и в параметрах указана вся информация: [dateX_month: 'value', dateX_day: 'value', ...]

Я искал в сети и ничего не нашел по этому поводу. Я надеялся, что Grails 1.3.0 может помочь, но все же то же самое.

Я не могу и не верю, что извлечение даты вручную необходимо!

Ответы [ 6 ]

84 голосов
/ 20 мая 2010

Версия Grails> = 2.3

Параметр в Config.groovy определяет форматы даты, которые будут использоваться во всем приложении при привязке параметров к Date

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

Форматы, указанные в grails.databinding.dateFormats, будут предприниматься в том порядке, в котором они включены в Список.

Вы можете переопределить эти форматы в масштабе приложения для отдельного объекта команды, используя @BindingFormat

import org.grails.databinding.BindingFormat

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

Версия Grails <2.3 </h2> Я не могу и не верю, что извлечение даты вручную необходимо! Ваше упрямство вознаграждается, связать дату можно было непосредственно задолго до Грааля 1.3. Шаги: (1) Создать класс, который регистрирует редактор для вашего формата даты 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) Сообщите Grails об этом редакторе дат, зарегистрировав следующий компонент в grails-app/conf/spring/resources.groovy beans = { customPropertyEditorRegistrar(CustomDateEditorRegistrar) } (3) Теперь, когда вы отправляете дату в параметре с именем foo в формате yyyy/MM/dd, она будет автоматически привязана к свойству с именем foo с помощью: myDomainObject.properties = params или new MyDomainClass(params)

14 голосов
/ 29 ноября 2012

Grails 2.1.1 имеет новый метод в параметрах для простого нулевого безопасного анализа.

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

Найти в документе здесь

11 голосов
/ 24 августа 2016

Версия Grails> = 3.x

Вы можете установить в application.yml форматы даты, следующие этому синтаксису:

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"
2 голосов
/ 27 июня 2012

@ Дон Спасибо за ответ выше.

Вот альтернатива пользовательскому редактору, который проверяет сначала дату, а затем формат даты.

Groovy, просто добавьте точку с запятой обратно для 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) : "")
    }
}
2 голосов
/ 21 мая 2010

Вы пробовали использовать какие-либо плагины для выбора даты в Grails?

У меня был хороший опыт работы с календарным плагином .

(при использовании плагина календаря). Когда вы отправляете запрос на выбор даты, вы можете автоматически привязать параметр запроса к объекту домена, который вы хотите заполнить запросом.

1009 * Е.Г. *

new DomainObject(params)

Вы также можете проанализировать строку даты "гггг / мм / дд", например, так ...

new Date().parse("yyyy/MM/dd", "2010/03/18")
1 голос
/ 10 апреля 2015

Версия Grails> = 2.3

A localeAware версия для преобразования строк в дату

В срк / 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
    }
}

В conf / spring / resources.groovy:

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

Имя компонента 'defaultDateConverter' действительно важно (для переопределения конвертера дат по умолчанию)

...