2013-06-21 6 views
7

binden Ich habe ein Datum (als eine Zeichenfolge) eingereicht. Ich möchte dies einem Befehlsobjekt zuordnen. Ich habe mich ein wenig umgeschaut und keine großartige Ressource gefunden, wie man dieses Mapping innerhalb eines Befehlsobjekts auf ein echtes Datum anwenden kann.Datum an Befehlsobjekt in Grails

Wenn ich dies in der Steuerung selbst tun würde, könnte ich einfach folgendes tun, dies erlaubt mir jedoch nicht, einfach in mein Befehlsobjekt zu mappen.

Für mein Befehlsobjekt habe ich das Getter und Setter für das Datumsobjekt am nächsten gebracht. Beide müssen überschrieben werden, da sonst der Setter nicht verwendet wird. Dies ist, was ich zuerst versuchte (setzen Sie die Zeichenfolge auf Datum, aber erhalten Sie das Datum). So berührt dies die Setter verwenden:

@grails.validation.Validateable 
class TaskCreateCommand { 

    Date startDate 


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

} 

Dies keine Laufzeitprobleme nicht geben, aber es ist nutzlos, weil ich nicht das tatsächliche Date-Objekt herausziehen kann.

@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

War die Antwort hilfreich? – dmahapatro

Antwort

6

Co-übrigens war ich auf das gleiche Problem heute suchen, und anschließend this Antwort von @Don. Ich konnte ein Datum korrekt an das Befehlsobjekt binden.

@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, Wie wählt Grails einen, wenn Sie mehrere 'CustomDateEditorRegistrar's erstellen? –

12

Wenn Sie mit Grails 2.3 oder höher können Sie mehrere benutzerdefinierte Datumsformate für Daten hinzufügen in Ihrem Config.groovy Bindung

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

Dann, wenn Grails versucht, die Anforderungsparameter auf Befehl zu binden Objekteigenschaften, wird Ihr benutzerdefiniertes Format versucht, wenn das Datum String in den Anforderungsparametern zB analysiert wird.

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

class MyCommandObject { 
    Date date 
} 

dann, wenn Sie z. >

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

auf der Konsole -

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

sollten Sie so etwas wie sehen.

+0

Was wäre der beste Weg, dies für Grails-Versionen vor 2.3 zu behandeln? –

+0

Sie müssen Ihren eigenen benutzerdefinierten Datumseditor registrieren, der ein bisschen mehr Arbeit ist. Http://stackoverflow.com/questions/2871977/binding-a-grails-date-from-params-in-a-controller für die Details. Es erweitert sich ein bisschen mehr, wie es geht als die akzeptierte Antwort hier. – AndrewW

+0

Es ist besser, einen ValueConverter von StringToDate wie folgt zu erstellen: http://stackoverflow.com/a/29552305/568179 (und es ist Gebietsschema bewusst;)) – mpccolorado