grails 中 hasMany 关系的选择性深度渲染 [英] Selective deep rendering of hasMany relationships in grails

查看:15
本文介绍了grails 中 hasMany 关系的选择性深度渲染的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于以下领域模型:

class Route {字符串名称静态 hasMany = [checkPoints:CheckPoint]静态belongsTo = [someBigObject:SomeBigObject]静态映射 = {检查点懒惰:假}}

我需要从 Web 服务以 JSON 形式返回特定的 Route.我希望这个 JSON 包含所有 checkPoints 但没有其他组合(即:someBigObject).

如果我这样做

def route = Route.findById(id)将路由渲染为 JSON

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

<代码>{"class": "com.example.Route",身份证":1,检查点":[{"class": "检查点",身份证":1},{"class": "检查点",身份证":2},{"class": "检查点",身份证":4},{"class": "检查点",身份证":3}],一些大对象":{"class": "SomeBigObject",身份证":2}}

但是如果我这样做

JSON.use('deep') {将路由渲染为 JSON}

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

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

解决方案

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

JSON.registerObjectMarshaller(Route) {返回 [name:it.name, checkPoints:it.checkPoints]}

有关于它的好文章:http://manbuildswebsite.com/2010/02/15/rendering-json-in-grails-part-3-customise-your-json-with-object-marshallers/>

希望能帮到你

For the following domain model:

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


    static mapping = {
        checkPoints lazy: false
    }
}

I need to return a specific Route as a JSON from a web service. And I want this JSON to contain all the checkPoints but no other compositions (i.e.:someBigObject).

If I do

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

all I got is the id's of the checkPoints, no other field is fetched:

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

but if I do

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

I get everything. I mean, almost all the database is getting fetched through various relationships.

Is there way to do this without creating the jsonMaps manually?

解决方案

You can register your own JSON marshaller for chosen classes and return properties which you want to render. Map can be done automatically by iteration over class fields. Marshaller ca be registered for example in bootstrap or in domain class during creation.

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

There is nice article about it under: http://manbuildswebsite.com/2010/02/15/rendering-json-in-grails-part-3-customise-your-json-with-object-marshallers/

Hope it helps

这篇关于grails 中 hasMany 关系的选择性深度渲染的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆