web-dev-qa-db-ja.com

コントローラーのparamsからGrailsの日付をバインドする

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が役立つことを願っていますが、それでも同じことです。

手で日付を抽出する必要があるとは信じられないでしょう。

40
nils petersohn

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)次のBeanをgrails-app/conf/spring/resources.groovyに登録することにより、Grailsにこの日付エディターを認識させます

beans = {
    customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}

(3)fooという名前のパラメータで日付をyyyy/MM/ddという形式で送信すると、fooという名前のプロパティに自動的にバインドされますどちらか:

myDomainObject.properties = params

または

new MyDomainClass(params)
85
Dónal

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

ドキュメントでそれを見つけてください こちら

14
Kumar Sambhav

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"
11
tgarcia

Grailsの日付選択プラグインを使用してみましたか?

calendar plugin で良い経験をしました。

(カレンダープラグインを使用する場合)日付選択のリクエストを送信すると、クエリパラメータをリクエストで入力するドメインオブジェクトに自動的にバインドできます。

例えば。

new DomainObject(params)

次のように「yyyy/MM/dd」日付文字列を解析することもできます...

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

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

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」は非常に重要です(デフォルトの日付コンバーターをオーバーライドするため)

1
mpccolorado