grails中hasMany关系的选择性深度渲染

Posted

技术标签:

【中文标题】grails中hasMany关系的选择性深度渲染【英文标题】:Selective deep rendering of hasMany relationships in grails 【发布时间】:2013-01-15 13:06:17 【问题描述】:

对于以下领域模型:

class Route 
    String  name
    static  hasMany     = [checkPoints:CheckPoint]  
    static  belongsTo   = [someBigObject:SomeBigObject]


    static mapping = 
        checkPoints lazy: false
    

我需要从 Web 服务返回特定的 Route 作为 JSON。我希望这个 JSON 包含所有 checkPoints,但不包含其他组合(即:someBigObject)。

如果我这样做了

def route = Route.findById(id)
render route as JSON

我得到的只是 checkPoints 的 id,没有获取其他字段:


    "class": "com.example.Route",
    "id": 1,
    "checkPoints": [
        
            "class": "CheckPoint",
            "id": 1
        ,
        
            "class": "CheckPoint",
            "id": 2
        ,
        
            "class": "CheckPoint",
            "id": 4
        ,
        
            "class": "CheckPoint",
            "id": 3
        
    ],
    "someBigObject": 
        "class": "SomeBigObject",
        "id": 2
    

但如果我这样做了

JSON.use('deep') 
    render route as JSON

我得到了一切。我的意思是,几乎所有的数据库都是通过各种关系获取的。

有没有办法在不手动创建 jsonMaps 的情况下做到这一点?

【问题讨论】:

【参考方案1】:

您可以为选定的类注册自己的 JSON 编组器并返回要呈现的属性。映射可以通过对类字段的迭代自动完成。 Marshaller 可以在创建期间例如在引导程序或域类中注册。

JSON.registerObjectMarshaller(Route) 
    return [name:it.name, checkPoints:it.checkPoints]

下面有一篇不错的文章:http://manbuildswebsite.com/2010/02/15/rendering-json-in-grails-part-3-customise-your-json-with-object-marshallers/

希望对你有帮助

【讨论】:

我们可以在其他对象编组器示例中调用对象编组器吗在这里我们可以为从“路由”编组器调用的检查点自定义编组器 只需为检查点注册专用编组器。在 Route marshaller 中使用 Checkpoint 对象。如果面对受支持类型的对象,则应自动使用检查点编组器。

以上是关于grails中hasMany关系的选择性深度渲染的主要内容,如果未能解决你的问题,请参考以下文章

grails:脚手架为具有 hasMany 关系的域创建视图

为啥grails在第一次访问hasMany关系时抛出空指针异常?

Laravel Eloquent 中的多级深度 hasMany 关系

Grails 默认排序的“hasMany”域属性

Grails - 简单的 hasMany 问题 - 在 create.gsp 中使用 CheckBoxes 而不是 HTML Select

在 Grails 中扩展具有一对多关系的域类