Связывание даты Grails с параметрами в controllerе

Почему так сложно извлечь дату из представления через параметры в controllerе 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 может помочь, но все равно то же самое.

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

Версия 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

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

Ваше упрямство вознаграждено, было возможно связать дату непосредственно задолго до Grails 1.3. Шаги:

(1) Создайте class, который регистрирует редактор для формата даты

 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) 

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

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

Версия 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" 

Вы пробовали использовать любой из плагинов выбора даты Grails?

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

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

Например

 new DomainObject(params) 

Вы также можете проанализировать строку даты «yyyy / MM / dd», например …

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

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

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

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) : "") } } 

Версия Grails> = 2.3

Версия localeAware для преобразования строк на сегодняшний день

В 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 } } 

В conf / spring / resources.groovy:

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

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

  • Как это сделать, я получаю вывод команды оболочки, выполненной с использованием переменной из Jenkinsfile (groovy)?
  • Могу ли я поменять обои для рабочего стола Windows программно в Java / Groovy?
  • Как получить только имя родительского каталога определенного файла
  • Найдено общие ссылки на коллекцию org.hibernate.HibernateException
  • Groovy: создание карты с конкретными атрибутами объекта JAX-B
  • Скопировать содержимое всего каталога в другой каталог?
  • «зависимости» не могут применяться к «(groovy.lang.Closure)»
  • Как переместить большие файлы с помощью RestTemplate?
  • Поле Gson Serialize, если оно не пустое или не пустое
  • Как автоматически загружать базу данных в Groovy без использования ключа -cp?
  • Hibernate: автоматическое создание / обновление таблиц db на основе classов сущностей
  • Interesting Posts
    Давайте будем гением компьютера.