json - Grails obtienen objetos de dominio hijo
grails-domain-class (4)
El problema es con el uso del convertidor JSON predeterminado. Estas son sus opciones:
1. Default - all fields, shallow associations
a. render blah as JSON
2. Global deep converter - change all JSON converters to use deep association traversal
a. grails.converters.json.default.deep = true
3. Named config marshaller using provided or custom converters
a. JSON.createNamedConfig(''deep''){
it.registerObjectMarshaller( new DeepDomainClassMarshaller(...) )
}
b. JSON.use(''deep''){
render blah as JSON
}
4. Custom Class specific closure marshaller
a. JSON.registerObjectMarshaller(MyClass){ return map of properties}
b. render myClassInstance as JSON
5. Custom controller based closure to generate a map of properties
a. convert(object){
return map of properties
}
b. render convert(blah) as JSON
Actualmente está utilizando la Opción 1, que es la predeterminada.
Lo más simple que puede hacer es usar la Opción 2 para configurar el convertidor global profundo, pero tenga en cuenta que esto afecta TODAS las clases de dominio en su aplicación. Lo que significa que si tienes un gran árbol de asociaciones que culmina en un objeto de nivel superior e intentas convertir una lista de esos objetos de nivel superior, el convertidor de profundidad ejecutará todas las consultas para buscar todos los objetos asociados y sus objetos asociados en giro. - Podrías cargar una base de datos completa de una sola vez :) Ten cuidado.
Tengo dos clases de dominio, una es padre y otra es hija y tengo una relación hasMany entre ellas. La clase para padres tiene muchos hijos y la clase para niños pertenece a la clase para padres. Y aquí está el ejemplo de codificación.
class Parent{
String name
static hasMany = [childs:Child]
static constraints = {
}
}
class Child{
String name
static belongsTo = [parent:Parent]
static constraints={}
}
El problema es que tan pronto como consigo el objeto principal, también se recuperaron los objetos secundarios asociados con la clase principal. Pero cuando convierto el objeto en JSON, no veo el objeto secundario por completo, solo puedo ver las ID de los objetos secundarios. Quiero ver todas las columnas de objetos secundarios en lugar de solo Id.
Respuesta JSON convertida:
[{"class":"project.Parent","id":1,
"name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}]
Pero quiero la respuesta que contiene el nombre del objeto secundario también, de la siguiente manera
[{"class":"project.Parent","id":1,"name":"name1",
"childs":[{"class":"Child","id":1,"name":"childname1"},
{"class":"Review","id":2,"name":"childname2"}
]
}]
Cualquier ayuda muy apreciada. Gracias por adelantado.
La solución sugerida está funcionando, sin embargo tuve algunos problemas para hacer referencia a "grailsApplication". Resulta que puedes ingerirlo como cualquier otro servicio. Puse el siguiente código en el
BootStrap.groovy
archivo. Además, la clase DeepDomainClassMarshaller maneja referencias circulares bastante bien bidireccionales, pero tenga en cuenta que la carga útil de JSON no es demasiado grande después de todas las referencias profundas.
package aisnhwr
import grails.converters.JSON
import grails.core.GrailsApplication
import org.grails.web.converters.marshaller.json.DeepDomainClassMarshaller
class BootStrap {
GrailsApplication grailsApplication
def init = { servletContext ->
JSON.createNamedConfig(''deep''){
it.registerObjectMarshaller( new DeepDomainClassMarshaller(false, grailsApplication) )
}
}
def destroy = {
}
}
Los últimos griales se convierten automáticamente en profundidades, pero probablemente sea víctima de cargas perezosas.
Los niños no están cargados en el acceso y, por lo tanto, el convertidor JSON no puede convertirlos a JSON. La solución alternativa es poner esto
mapeo estático = {childs lazy: false}
el usuario dbrin es correcto, pero hay una opción más. También puede usar el Plugin GSON de Grails:
https://github.com/robfletcher/grails-gson#readme
El complemento agrega algunas características más cuando se trata de datos json.