2010-12-28 5 views
8

Diese Frage kommt von dem Problem von another question von mir. In dieser Frage stoße ich auf eine Situation, die hasErrors() Funktion funktioniert nicht für nicht persistente Domain-Klasse, auch nach all den Dingen, die ich nach the instruction, Teil 7.5.Was ist die Verbindung zwischen validate() und hasErrors()

Nach dem Weg von Victor habe ich das Problem behoben, indem ich validate() aufgerufen habe, aber ich verstehe nicht, warum es funktioniert. Die Grails-Dokumente scheinen nichts zu sagen, sollten Sie eine validate() aufrufen, bevor die Funktion hasErrors() funktioniert. Wie konnte das passieren?

Antwort

9

Es macht Sinn für mich, dass validate, bevor er fragt ein Objekt aufgerufen werden müßte, ob es hasErrors (oder save für die richtigen Domain-Objekte, die validate unter der Decke nennt). Validierung in diesem Kontext bedeutet "Prüfe, ob dieses Objekt gültig ist und ggf. Fehler anzeigen". Die GORM-Implementierung müsste bei jeder Änderung an einem Objekt alternativ validate aufrufen, was für mich ein weniger wünschenswertes Verhalten wäre, da es oft viel Arbeit erfordert, die oft und unnötig ausgeführt wird (einige dieser Einschränkungen könnten) viel Arbeit mit sich bringen).

Der Anfang von Abschnitt 7.2 sagt ziemlich klar "Um eine Domain-Klasse zu validieren, können Sie die validate-Methode für jede Instanz aufrufen". Es stellt auch fest, dass "innerhalb Grails gibt es im Wesentlichen 2 Phasen der Validierung, die erste Phase ist Datenbindung, die auftritt, wenn Sie Request-Parameter auf eine Instanz wie binden ... An dieser Stelle haben Sie möglicherweise bereits Fehler in der Eigenschaft Fehler aufgrund Typkonvertierung (z. B. Umwandlung von Strings in Datumsangaben). Sie können diese überprüfen und den ursprünglichen Eingabewert mithilfe der Fehler-API abrufen ... Die zweite Phase der Validierung findet statt, wenn Sie validate oder save aufrufen Werte gegen die von Ihnen definierten Einschränkungen. "

Die documentation for hasErrors erwähnt auch dies. Sie können darauf zugreifen, indem Sie den Methodenaufruf im Navigationsrahmen links finden, wenn Sie sich auf der documentation site befinden. Ich würde immer empfehlen, sowohl auf diese als auch auf die beschreibenden Benutzerleitfäden zu schauen, da diese oft ein wenig detaillierter sind. Here's the page for the validate method auch.

Ich hatte noch nie ein Problem validate direkt aufrufen - es mir sehr klar, und ich kann den Punkt wählen, wo die ganze Arbeit getan ist und ich bin bereit für die Validierung stattfinden soll. Ich kann keine Option sehen, um dieses Verhalten irgendwo zu ändern, aber wenn Sie möchten, dass validate automatisch oder unter bestimmten Bedingungen aufgerufen wird, könnten Sie vielleicht einige Groovy Meta-Programmierzauber verwenden, indem Sie invokeMethod zu der Klasse hinzufügen und validate vor dem Übergeben aufrufen bestimmte Anrufe an. Schau mal here und here. (Nicht sicher, ich würde das aber empfehlen! Und bedenken Sie, dass Ihre Klasse jetzt davon abhängig sein würde, innerhalb des GORM-Validierungs-Frameworks verwendet zu werden, da die validate-Methode sonst möglicherweise nicht existiert).

+0

Vielen Dank für Ihre sorgfältige Antwort, ich verstehe es jetzt. –

+2

Übrigens ... Peter Ledbrook (einer der Autoren des hervorragenden Buches Grails in Action) hat eine großartige Artikelserie über GORM Gotchas geschrieben - sehr lesenswert, um einige Details zu erfahren arbeitet: [Teil 1] (http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/), [Teil 2] (http://blog.springsource.com/2010/ 07/02/gorm-gotchas-part-2 /) und [part 3] (http://blog.springsource.com/2010/07/28/gorm-gotchas-part-3/). –

Verwandte Themen