2013-06-21 5 views
7

日付(文字列として)が送信されています。私はこれをコマンドオブジェクトにマップしたいと思います。私はかなり見渡して、コマンドオブジェクト内でこのマッピングをどのようにして実際の日付にするかに関する大きなリソースは見つかりませんでした。Grailsのコマンドオブジェクトへの日付のバインド

コントローラでこれを行う場合、私は次のことを行うことができますが、これでコマンドオブジェクトに簡単にマッピングすることはできません。

def endDate = params.date('endDate', 'MM/dd/yyyy') 

私のコマンドオブジェクトは、取得できる最も近いものは、日付オブジェクトのゲッターとセッターをオーバーライドすることです。どちらもオーバーライドする必要があります。そうでなければ、セッターは使用されません。これは私が最初に試みたものです(StringをDateに設定しますが、Dateを取得します)。したがって、これはセッターを使用しません。

@grails.validation.Validateable 
class TaskCreateCommand { 

    Date startDate 


    public void setStartDate(String dateStr){ 
     this.start = Date.parse('MM/dd/yyyy', dateStr) 
    } 

} 

これは実行時に問題はありませんが、実際のDateオブジェクトを引き出すことができないため役に立たないです。

@grails.validation.Validateable 
class TaskCreateCommand { 

    Date startDate 


    public void setStartDate(String dateStr){ 
     this.start = Date.parse('MM/dd/yyyy', dateStr) 
    } 

    public String getStartDate(){ 
     return start.toString() 
    } 
} 
+0

回答が役に立ちましたか? – dmahapatro

答えて

6

今日も同じ問題を抱えていて、@Donからthis答えが続きました。コマンドオブジェクトに日付を正しくバインドすることができました。

@Validateable 
class BookCommand { 
    String name 
    Date pubDate 
    Integer pages 
} 

//Controller 
def index(BookCommand cmd) { 
     println cmd.name 
     println cmd.pages 
     println cmd.pubDate 

     render "Done" 
    } 

//src/groovy 
class CustomDateEditorRegistrar implements PropertyEditorRegistrar { 
    public void registerCustomEditors(PropertyEditorRegistry registry) { 
     String dateFormat = 'yyyy/MM/dd' 
     registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true)) 
    } 
} 

//URL 
http://localhost:8080/poc_commandObject/book?name=Test&pages=10&pubDate=2012/11/11 

//Println 
Test 
10 
Sun Nov 11 00:00:00 EST 2012 
+0

Dhiraj、複数の 'CustomDateEditorRegistrar'を作成した場合、Grailsはどのように選択しますか? –

12

あなたはGrailsの2.3以降を使用している場合はGrailsのコマンドにリクエストパラメータをバインドしようとしたとき、あなたはその後、あなたのConfig.groovyに

grails.databinding.dateFormats = ["MM/dd/yyyy"] 

データバインディングのために複数のカスタム日付フォーマットを追加することができますがオブジェクトのプロパティでは、リクエストパラメータの日付文字列を解析するときにカスタムフォーマットが試行されます。

class MyController { 
    def myAction(MyCommandObject cmd) { 
     println cmd.date 
     println cmd.date.class 
    } 
} 

class MyCommandObject { 
    Date date 
} 

次に、たとえばヒットしたとき。あなたのコンソール上>

Fri Dec 13 00:00:00 EST 2013 
class java.util.Date 

-

http://localhost:8080/myController/myAction?date=12/13/2013 

次のようなものが表示されるはずです。

+0

2.3より前のGrailsバージョンでこれを処理する最良の方法は何でしょうか? –

+0

もう少し作業が必要な独自のカスタム日付エディタを登録する必要があります。詳細については、http://stackoverflow.com/questions/2871977/binding-a-grails-date-from-params-in-a-controllerをご覧ください。それはここで受け入れられた答えよりも、それを行う方法についてもう少し詳しく説明します。 – AndrewW

+0

StringToDateからValueConverterを作成する方が良いです:http://stackoverflow.com/a/29552305/568179(それはロケール対応です)) – mpccolorado

関連する問題