在控制器中绑定参数中的Grailsdate

为什么通过grails控制器中的参数从视图中提取date非常困难?

我不想像这样手工提取date:

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

我只想使用instance.properties = params

在模型中,types是java.util.Date ,在params中是所有信息: [dateX_month: 'value', dateX_day: 'value', ...]

我在网上search,没有发现任何东西。 我希望Grails 1.3.0可以帮助但仍然是同样的事情。

我不能也不会相信用手提取date是必要的!

Grails版本> = 2.3

Config.groovy的设置定义将参数绑定到Date时将在整个应用程序范围内使用的date格式

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

grails.databinding.dateFormats指定的格式grails.databinding.dateFormats列表中包含的顺序进行尝试。

您可以使用@BindingFormat单个命令对象的这些应用程序范围的格式

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

Grails版本<2.3

我不能也不会相信用手提取date是必要的!

你的固执性得到了回报,在Grails 1.3之前就可以直接绑定一个date。 步骤是:

(1)创build一个为您的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)通过在grails-app/conf/spring/resources.groovy注册以下bean来让Grails知道这个date编辑器

 beans = { customPropertyEditorRegistrar(CustomDateEditorRegistrar) } 

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

 myDomainObject.properties = params 

要么

 new MyDomainClass(params) 

Grails 2.1.1在params中有一个新的方法来实现简单的null安全parsing。

 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中find它

Grails版本> = 3.x

您可以在application.yml中设置以下语法的date格式:

 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" 

你有没有尝试过使用任何Grailsdateselect器插件?

我对日历插件有很好的体验。

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

例如

 new DomainObject(params) 

你也可以像这样parsing“yyyy / MM / dd”datestring…

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

@Don感谢上面的答案。

这是自定义编辑器的另一种select,它检查第一个date时间和date格式。

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

用于将string转换为date的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') } } 

bean的名字'defaultDateConverter'非常重要(覆盖默认的date转换器)