Je développe une interface RESTful qui est utilisée pour fournir des données JSON à une application JavaScript.
Côté serveur, j'utilise Grails 1.3.7 et j'utilise les objets de domaine GORM pour la persistance. J'ai implémenté un Marshaller JSON personnalisé pour prendre en charge le marshalling des objets de domaine imbriqués.
Voici des exemples d'objets de domaine :
class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}
y
class SampleDomainNested {
String someField
}
La ressource SampleDomain est publiée sous l'URL /rs/sample/, donc /rs/sample/1 pointe vers l'objet SampleDomain avec l'ID 1.
Lorsque je rends la ressource en utilisant mon marshaller json personnalisé (GET sur /rs/sample/1), j'obtiens les données suivantes :
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
ce qui est exactement ce que je veux.
Maintenant vient le problème : j'essaie d'envoyer les mêmes données à la ressource /rs/sample/1 via PUT.
Pour lier les données json à l'objet de domaine, le contrôleur traitant la demande appelle def domain = SampleDomain.get(id)
y domain.properties = data
où les données sont les objets non marqués.
La liaison pour le champ "someString" fonctionne parfaitement, mais l'objet imbriqué n'est pas alimenté par les données imbriquées et je reçois une erreur indiquant que la propriété "nest2" est nulle, ce qui n'est pas autorisé.
J'ai déjà essayé d'implémenter un PropertyEditorSupport
ainsi qu'un StructuredPropertyEditor
et enregistrer l'éditeur pour la classe.
Bizarrement, l'éditeur n'est appelé que lorsque je fournis des valeurs non imbriquées. Ainsi, lorsque j'envoie ce qui suit au serveur via PUT (ce qui n'a aucun sens ;) )
{
"someString" : "somevalue1",
"nest2" : "test"
}
au moins l'éditeur de propriétés est appelé.
J'ai regardé le code de la GrailsDataBinder
. J'ai découvert que la définition des propriétés d'une association semble fonctionner en spécifiant le chemin de l'association au lieu de fournir une carte, donc ce qui suit fonctionne également :
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
mais cela ne m'aide pas puisque je ne veux pas mettre en œuvre un sérialiseur d'objets JavaScript vers JSON personnalisé.
Est-il possible d'utiliser la liaison de données Grails en utilisant des cartes imbriquées ? Ou dois-je vraiment l'implémenter à la main pour chaque classe de domaine ?
Merci beaucoup,
Martin