Grailsコントローラーのparamsを使用してビューから日付を抽出するのが難しいのはなぜですか?
次のように手で日付を抽出したくありません。
instance.dateX = parseDate(params["dateX_value"])//parseDate is from my helper class
使用したいのはinstance.properties = params
。
モデルでは、タイプはJava.util.Date
およびparamsにはすべての情報があります:[dateX_month: 'value', dateX_day: 'value', ...]
私はネットで検索しましたが、これには何も見つかりませんでした。 Grails 1.3.0が役立つことを願っていますが、それでも同じことです。
手で日付を抽出する必要があるとは信じられないでしょう。
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 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)次のBeanをgrails-app/conf/spring/resources.groovy
に登録することにより、Grailsにこの日付エディターを認識させます
beans = {
customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}
(3)foo
という名前のパラメータで日付をyyyy/MM/dd
という形式で送信すると、foo
という名前のプロパティに自動的にバインドされますどちらか:
myDomainObject.properties = params
または
new MyDomainClass(params)
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')
ドキュメントでそれを見つけてください こちら
この構文に従って、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の日付選択プラグインを使用してみましたか?
calendar plugin で良い経験をしました。
(カレンダープラグインを使用する場合)日付選択のリクエストを送信すると、クエリパラメータをリクエストで入力するドメインオブジェクトに自動的にバインドできます。
例えば。
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.
文字列を日付に変換する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」は非常に重要です(デフォルトの日付コンバーターをオーバーライドするため)