Sto sviluppando un'interfaccia RESTful che viene utilizzata per fornire dati JSON per un'applicazione JavaScript.Associazione JSON a oggetti di dominio Grails nidificati
Sul lato server utilizzo Grails 1.3.7 e utilizzo Oggetti Dominio GORM per la persistenza. Ho implementato una consuetudine JSON Marshaller per sostenere smistamento dominio nidificato oggetti
Qui ci sono oggetti di dominio di esempio:
class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}
e
class SampleDomainNested {
String someField
}
La risorsa SampleDomain è pubblicato sotto l'URL/RS/campione/so/rs/sample/1 punta all'oggetto SampleDomain con ID 1
Quando eseguo il rendering della risorsa utilizzando il mio custom json marshaller (GET su/rs/sample/1), ottengo i seguenti dati:
che è esattamente quello che voglio.
Ora arriva il problema: provo a inviare gli stessi dati alla risorsa/rs/sample/1 via PUT.
Per collegare i dati JSON all'oggetto dominio, il controller che gestisce la richiesta chiama def domain = SampleDomain.get(id)
e domain.properties = data
dove i dati sono l'oggetto non protetto.
L'associazione per il campo "someString" funziona correttamente, ma l'oggetto nidificato non viene popolato utilizzando i dati nidificati, pertanto viene visualizzato un errore indicante che la proprietà "nest2" è nullo, il che non è consentito.
Ho già provato a implementare un numero personalizzato PropertyEditorSupport
e un StructuredPropertyEditor
e registrare l'editor per la classe.
Stranamente, l'editor viene chiamato solo quando fornisco valori non annidati. Così, quando mando il seguente al server tramite PUT (che non ha alcun senso;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
almeno l'editor di proprietà viene chiamato.
Ho esaminato il codice dello GrailsDataBinder
. Ho scoperto che l'impostazione delle proprietà di un'associazione sembra funzionare specificando il percorso dell'associazione invece di fornire una mappa, in modo che il seguito a lavori così:
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
ma questo non mi aiuta quando ho don' t desidera implementare un codice JavaScript personalizzato per il serializzatore di oggetti JSON.
È possibile utilizzare l'associazione dati Grails utilizzando le mappe nidificate? O devo davvero implementarlo a mano per ogni classe di dominio?
Grazie mille,
Martin
hai anche un unmarshaller JSON personalizzato? – fixitagain
No, non ho un jab unmarshaller personalizzato. Analizzo la richiesta utilizzando request.JSON. Quello che vorrei è un editor di proprietà che supporta sia la creazione di un oggetto dominio da una mappa, sia il caricamento/mappatura di un oggetto dominio per ID. – frow
Hai provato questo plugin: http://www.grails.org/plugin/json-rest-api –