Binding JSON-nested Grails-Domain-Objekten

Ich bin die Entwicklung einer RESTful Schnittstelle, die verwendet wird, um JSON-Daten für eine JavaScript-Anwendung.

Auf der server-Seite, die ich verwenden Grails 1.3.7 und verwenden GORM Domain-Objekte für die Persistenz. Ich habe implementiert eine benutzerdefinierte JSON-Marshaller Unterstützung marshalling der geschachtelten Domänen-Objekte

Hier sind Beispiele für domain-Objekte:

class SampleDomain {
    static mapping = { nest2 cascade: 'all' }
    String someString
    SampleDomainNested nest2
}

und

class SampleDomainNested {
    String someField
}

Den SampleDomain Ressource ist veröffentlicht unter der URL /rs/sample/so /rs/sample/1 Punkte der SampleDomain Objekt mit der ID 1

Wenn ich render die Ressource mit meiner benutzerdefinierte json-marshaller (GET on /rs/Probe/1) bekomme ich folgende Daten:

{
    "someString" : "somevalue1",
    "nest2" : {
        "someField" : "someothervalue"
    }
}

das ist genau das, was ich will.

Nun kommt das problem: ich versuche zum senden der gleichen Daten an die Ressource /rs/sample/1 über STELLEN.

Binden Sie die json-Daten zum Domain-Objekt, das controller-handling die Anfrage fordert def domain = SampleDomain.get(id) und domain.properties = data wo die Daten der unmarshallt Objekt.

Wird die Bindung für die "classextender" - Feld funktioniert nur gut, aber das verschachtelte Objekt ist nicht gefüllt, mit dem verschachtelten Daten, so bekomme ich eine Fehlermeldung, dass die Eigenschaft "nest2" ist null, was nicht zulässig ist.

Ich habe bereits versucht, die Implementierung einer benutzerdefinierten PropertyEditorSupport sowie eine StructuredPropertyEditor und registrieren Sie den editor für die Klasse.

Seltsam, der editor wird nur aufgerufen, wenn ich die Lieferung nicht-geschachtelte Werte. Also, wenn ich senden Sie die folgenden an den server über PUT (das macht keinen Sinn 😉 )

{
    "someString" : "somevalue1",
    "nest2" : "test"
}

mindestens der property editor aufgerufen wird.

Ich schaute auf den code der GrailsDataBinder. Ich fand heraus, dass die Einstellung der Eigenschaften einer Assoziation scheint zu funktionieren, indem Sie den Pfad des Verbandes anstelle der Bereitstellung einer Karte, so dass die folgenden Werke als gut:

{
    "someString" : "somevalue1",
    "nest2.somefield" : "someothervalue"
}

aber das hilft mir nicht, da ich nicht möchten, implementieren Sie ein benutzerdefiniertes JavaScript, JSON Objekt-Serialisierung.

Ist es möglich, Grails Datenbindung mithilfe von verschachtelten maps? Oder muss ich wirklich hieven zu implementieren, die von hand für jede domain-Klasse?

Vielen Dank,

Martin

  • Sie haben eine benutzerdefinierte json-unmarshaller wie gut?
  • Nein, ich habe keine benutzerdefinierte json-unmarshaller. Ich parse die Anfrage mittels Anfrage.JSON. Was ich möchte ist, einen property-editor, der das unterstützt sowohl das erstellen einer Domänen-Objekt aus einer Karte sowie das laden/die Zuordnung eines domain-Objekt-ID.
  • Haben Sie versuchen, dieses plugin : grails.org/plugin/json-rest-api
  • Danke für den Hinweis. Ich habe versucht, das plugin, aber es unterstützt nur "flach" domain-Objekte, dh alle assocations gerendert werden als IDs. Aber ich fand inspiration in das plugin. Ich denke ich werde mir zur Umsetzung ein mapper, deren Verhalten gesteuert wird von ein paar statics in die domain-Objekte (z.B. Ressource-url referenzierten Eigenschaften, embedded-Eigenschaften...)
  • haben Sie versucht, gson ? Sie werden wahrscheinlich besser mit... aber ich bin sicher, es gibt einen Weg, um diesem die grails Weg.
  • Ich habe auf der Suche in das tun dieses mit Gson und es ist sehr leicht bis zu einem Punkt. Das problem kommt, wenn in dem Fall, wo eine id-Eigenschaft vorhanden ist, die Sie Lesen möchten die domain-Instanz aus der Datenbank, anstatt nur den Bau einer neuen. Ich habe nicht herausgefunden, eine Möglichkeit, einen Blick Voraus in das JSON-stream zu sehen, wenn Sie eine id ohne auch re-implementieren Sie die Ruhe der Immobilie verbindlich Logik.

InformationsquelleAutor frow | 2011-09-23
Schreibe einen Kommentar