不支持JSONRenderer的Grails排除了嵌套模型?

时间:2014-08-14 16:48:36

标签: json grails

我的Grails应用程序中有一个REST端点,它可以呈现它对JSON的响应。 class正在包含在JSON响应中:

{
    "class": "app.User"
    "id": null,
    "admin": false,
    "contact": {
        "class": "app.Contact",
        "id": "EEF448FE-ABDC-4C2E-B10B-CD448336FC51",
        "email": "qa_costco_drop_test@commercehub.com",
        "firstName": "first",
        "lastName": "last",
        "state": {
            "class": "app.State",
            ...
        }
    }
}

我在`grails-app / conf / spring / resources.groovy'

中添加了几个JSONRenderer bean
userJSONRenderer(JsonRenderer, User) {
    excludes = ['class']
}
contactJSONRenderer(JsonRenderer, Contact) {
    excludes = ['class']
}
stateJSONRenderer(JsonRenderer, State) {
    excludes = ['class']
}

这摆脱了顶级用户的class属性,但我仍然获得了Contact和State类:

{
    "id": null,
    "admin": false,
    "contact": {
        "class": "app.Contact",
        "id": "EEF448FE-ABDC-4C2E-B10B-CD448336FC51",
        "email": "qa_costco_drop_test@commercehub.com",
        "firstName": "first",
        "lastName": "last",
        "state": {
            "class": "app.State",
            ...
        }
    }
}

嵌套模型是否需要特殊配置?

1 个答案:

答案 0 :(得分:1)

我无法让JSONRenderer适用于嵌套模型。我为我的所有域对象创建了一个渲染器,以为Grails会为我排序,但没有运气。有趣的是,渲染器在每个类型的顶层工作(即“/ users”,“/ contacts”,“/ state”),而不是嵌套对象。

我通过为对象图中的每个类型注册自定义对象marshallers来修复此问题。这可以按预期工作,但有点痛苦。

对象编组程序在JSON类上注册:

JSON.registerObjectMarshaller( User ) { User user ->
    return [
        id : user.id,
        admin: user.admin,
        contact: user.contact
    ]
}

您需要为每个域类添加一个编组器到Bootstrap.groovy。

我实际上走得更远,并使用spring bean跟随this example。那篇文章有一些很好的评论,讨论了注册编组人员的其他方法,包括域名本身。

如果你走这条路,请务必阅读我关于在Bootstrap.groovy中注册marshallers的评论,因为自撰写文章以来它已经发生了变化。