Grails Befehl Objekt Datenbindung
Grails hat sehr guter support für die Bindung an die request-Parameter zu einem domain-Objekt und Verbände. Diese stützt sich weitgehend auf die Erkennung von request-Parametern, mit Ende .id
und automatisch laden diese aus der Datenbank.
Es ist jedoch nicht klar, wie das Auffüllen der Verbände des command-Objekts. Nehmen Sie das folgende Beispiel:
class ProductCommand {
String name
Collection<AttributeTypeCommand> attributeTypes
ProductTypeCommand productType
}
Dieses Objekt hat einen single-ended-Verbindung mit ProductTypeCommand
und viele-ended-Verbindung mit AttributeTypeCommand
. Die Liste mit allen Attribut-Typen und Produkt-Typen sind verfügbar, von der eine Implementierung dieser Schnittstelle
interface ProductAdminService {
Collection<AttributeTypeCommand> listAttributeTypes();
Collection<ProductTypeCommand> getProductTypes();
}
Nutze ich diese Schnittstelle zum Auffüllen der Produkt-und Attribut-Typ-Auswahl-Listen in eine GSP. Ich habe auch Abhängigkeiten injizieren, diese Schnittstelle in den Kommando-Objekt, und verwenden Sie es, zu "simulieren" attributeTypes
und productType
Eigenschaften auf das command-Objekt
class ProductCommand {
ProductAdminService productAdminService
String name
List<Integer> attributeTypeIds = []
Integer productTypeId
void setProductType(ProductTypeCommand productType) {
this.productTypeId = productType.id
}
ProductTypeCommand getProductType() {
productAdminService.productTypes.find {it.id == productTypeId}
}
Collection<AttributeTypeCommand> getAttributeTypes() {
attributeTypeIds.collect {id ->
productAdminService.getAttributeType(id)
}
}
void setAttributeTypes(Collection<AttributeTypeCommand> attributeTypes) {
this.attributeTypeIds = attributeTypes.collect {it.id}
}
}
Was tatsächlich passiert ist, dass die attributeTypeIds
und productTypeId
Eigenschaften sind gebunden an die jeweiligen request-Parameter und die Getter/setter "simulieren" productType
und attributeTypes
Eigenschaften. Gibt es eine einfachere Möglichkeit zum Auffüllen der Verbände des command-Objekts?
InformationsquelleAutor der Frage Dónal | 2011-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun, die Sie wirklich brauchen, um sub-Befehle für attributeTypes und "productType" Eigenschaften? Irgendeinem Grund Sie nicht mit PropertyEditorSupport verbindlich? E. g.:
(und etwas ähnliches für attributeType-Objekt), und registrieren Sie diese in einem editor registrar:
Ist und registrieren Sie Ihre Ressourcen.groovy:
dann in Ihre Cmd-Sie müssen nur:
Wenn Sie tun müssen die tatsächlichen sub-Befehl Verbände dann habe ich etwas getan, was ähnlich zu dem, was @Andre Steingress hat vorgeschlagen, in Kombination mit PropertyEditorSupport Bindung:
Hoffentlich habe ich nicht falsch verstanden, was du versuchst zu erreichen 🙂
InformationsquelleAutor der Antwort Chris
Was ich gesehen habe in einigen Projekten wurde der Einsatz der Lazy - * - collection-Klassen aus den Apache Commons Collections. Es verwendet einen code wie diesen zu faul initialisieren, eine command-Verein:
Mit dem Beispiel oben, das Aps konnte Referenz-Verein Indizes
Dies funktioniert auch für nicht-existierenden Indizes, da jede get(index) call auf LazyList wertet aus, ob die Liste bereits ein element an dieser position und wenn nicht, wird die Liste automatisch in der Größe wachsen und die Rückgabe ein neues Objekt vom angegebenen Fabrik.
Beachten Sie, dass Sie können auch LazyMap, um einen ähnlichen code mit lazy Karten:
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/LazyMap.html
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/list/LazyList.html
Update:
Groovy 2.0 (das ist noch nicht Bestandteil des Grails-distribution) kommen mit embedded-Unterstützung für lazy und eager-Listen. Ich schrieb einen blog-post zu diesem Thema:
http://blog.andresteingress.com/2012/06/29/groovy-2-0-love-for-grails-command-objects/
Update:
Mit dem release von Grails 2.2.0, Groovy 2.0 ist Teil der distribution.
http://blog.andresteingress.com/2012/06/29/groovy-2-0-love-for-grails-command-objects/
InformationsquelleAutor der Antwort Andre Steingress
Ich habe vor dem gleichen problem mit dem verschachtelten Befehl Objekte, also hab ich folgenden workaround:
controller-Aktion
(in der Regel der Befehl " Objekt umschließt, die anderen command-Objekten
binden seine Daten erfolgreich ohne die Notwendigkeit, es zu binden
ausdrücklich, dies hängt von Ihrer Sicht naming convention)
Eigentum mit entsprechenden command-Objekts
Um zu veranschaulichen, hier ein Beispiel-pseudo-code:
In der Steuerung:
InformationsquelleAutor der Antwort simsim
Command-Objekt in Grails
In Grails, command-Objekte sind wie die domain-Klassen, aber nicht die Persistenz der Daten. Mithilfe des Befehls " Objekte in Grails ist eine einfache Möglichkeit zum ausführen von Datenbindung und-Validierung, wenn es keine Notwendigkeit zu erstellen, die Domäne-Objekt.
Erste, was Sie tun müssen, beschreiben Sie Ihr command-Objekt. Es ist schön zu tun in der gleichen Datei, die enthält controller, die Sie benutzen. Wenn command-Objekt wird verwendet, um mehr als einen controller, beschreiben Sie es in groovy-Quellcode-Verzeichnis.
Deklarieren Befehl Objekte
Mithilfe Des Befehls " Objekte
Nächste Sache, die Sie wahrscheinlich wollen, zu tun ist, binden Sie die Daten, die empfangen werden durch die Aktion in Ihrem controller, um das command-Objekt und validieren.
InformationsquelleAutor der Antwort R Tiwari