繁体   English   中英

Grails获取子域对象

[英]Grails get child domain objects

我有两个域类,一个是父类,另一个是子类,我们之间有一个hasMany关系。 父类有许多子级,子类属于父类。 这是编码示例。

class Parent{
   String name
    static hasMany = [childs:Child] 
    static constraints = {
   }
}


class Child{
   String name
   static belongsTo = [parent:Parent]
   static constraints={}
}

问题是,一旦我获得父对象,也会获取与父类关联的子对象。 但是当我将对象转换为JSON时,我没有完全看到子对象,我只能看到子对象的ID。 我想查看子对象的所有列而不是Id。

转换的JSON响应:

[{"class":"project.Parent","id":1,
  "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}]

但是我也想要包含子对象名称的响应,如下所示

[{"class":"project.Parent","id":1,"name":"name1",
  "childs":[{"class":"Child","id":1,"name":"childname1"},
            {"class":"Review","id":2,"name":"childname2"}
           ]
}]

任何帮助非常感谢。 提前致谢。

问题在于使用默认的JSON转换器。 以下是您的选择:

 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

您当前正在使用选项1,这是默认选项。

最简单的方法是使用选项2来设置全局深度转换器,但要注意这会影响应用程序中的所有域类。 这意味着如果你有一个大的关联树,最终在顶级对象中,并且你试图转换那些顶级对象的列表,则深度转换器将执行所有查询以获取所有关联对象及其关联对象。转。 - 你可以一次加载整个数据库 :)小心。

最新的grails会自动深度转换,但你可能是延迟加载的受害者。

子进程没有加载,因此JSON转换器无法将它们转换为JSON。 解决方法是把它

static mapping = {childs lazy:false}

用户dbrin是正确的,但还有一个选项。 你也可以使用Grails GSON插件:

https://github.com/robfletcher/grails-gson#readme

插件在处理json数据时增加了一些功能。

建议的解决方案正在运行,但我在引用“grailsApplication”时遇到了一些麻烦。 事实证明,您可以像任何其他服务一样摄取它。 我把以下代码放入

BootStrap.groovy中

文件。 此外, DeepDomainClassMarshaller类处理相当好的双向循环引用,但要注意JSON Payload在所有深度引用后都不会很大。

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 = {
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM