Estoy desarrollando una interfaz RESTful que se utiliza para proporcionar datos JSON para una aplicación JavaScript.Enlace JSON a objetos de dominio Grails anidados
En el lado del servidor, uso Grails 1.3.7 y uso objetos de dominio GORM para la persistencia. He implementado una costumbre JSON Marshaller para apoyar el guiado de la de dominios anidados objetos
Éstos son los objetos de dominio de muestra:
class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}
y
class SampleDomainNested {
String someField
}
El recurso SampleDomain se publica bajo la URL/rs/muestra/so/rs/sample/1 puntos al objeto SampleDomain con ID 1
Cuando renderizo el recurso utilizando mi masonhaller json personalizado (GET on/rs/sample/1), obtengo los siguientes datos:
{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}
que es exactamente lo que quiero.
Ahora viene el problema: trato de enviar los mismos datos al recurso/rs/sample/1 a través de PUT.
Para enlazar los datos json con el objeto de dominio, el controlador que maneja la solicitud llama a def domain = SampleDomain.get(id)
y domain.properties = data
donde los datos son el objeto no agrupado.
El enlace del campo "someString" funciona correctamente, pero el objeto anidado no se completa con los datos anidados, por lo que aparece un error que indica que la propiedad "nest2" es nula, lo que no está permitido.
Ya he intentado implementar un PropertyEditorSupport
personalizado así como un StructuredPropertyEditor
y registrar el editor para la clase.
Extrañamente, el editor solo recibe una llamada cuando proporciono valores no anidados. Así que cuando envío el siguiente al servidor a través PUT (lo que no tiene ningún sentido;))
{
"someString" : "somevalue1",
"nest2" : "test"
}
al menos, el editor de la propiedad es llamada.
Miré el código de GrailsDataBinder
. Descubrí que la configuración de propiedades de una asociación parece funcionar especificando la ruta de la asociación en lugar de proporcionar un mapa, por lo que el siguiente también funciona:
{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}
pero esto no me ayuda desde que don' Quiero implementar un JavaScript personalizado para el serializador de objetos JSON.
¿Es posible utilizar el enlace de datos Grails usando mapas anidados? ¿O realmente me esfuerzo por implementar eso a mano para cada clase de dominio?
Muchas gracias,
Martin
¿Tiene también un jason unmarshaller personalizado? – fixitagain
No, no tengo un unmarshaller json personalizado. Analizo la solicitud utilizando request.JSON. Lo que me gustaría es un editor de propiedades que admita tanto la creación de un objeto de dominio desde un Mapa como la carga/mapeo de un objeto de dominio por ID. – frow
¿Has probado este plugin ?: http://www.grails.org/plugin/json-rest-api –