在控制器中绑定参数中的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转换器)