将Grails日期与控制器中的params绑定

时间:2010-05-20 08:07:31

标签: data-binding date grails groovy 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可以帮助但仍然是同样的事情。

我不能也不会相信手工提取日期是必要的!

6 个答案:

答案 0 :(得分:84)

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)创建一个注册日期格式编辑器的类

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-app/conf/spring/resources.groovy

中注册以下bean,让Grails了解此日期编辑器
beans = {
    customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}

(3)现在,当您以foo格式在名为yyyy/MM/dd的参数中发送日期时,它将自动绑定到名为foo的属性使用:

myDomainObject.properties = params

new MyDomainClass(params)

答案 1 :(得分:14)

Grails 2.1.1在params中有一个新方法,可以轻松进行空安全解析。

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

在doc here

中找到它

答案 2 :(得分:11)

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"

答案 3 :(得分:2)

您是否尝试使用任何Grails日期选择器插件?

我对calendar plugin有很好的体会。

(使用日历插件时)提交日期选择请求时,您可以自动将查询参数绑定到要用请求填充的域对象。

E.g。

new DomainObject(params)

你也可以像这样解析“yyyy / MM / dd”日期字符串......

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

豆子的名字&#39; defaultDateConverter&#39;非常重要(覆盖默认日期转换器)