我的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 beanuserJSONRenderer(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",
...
}
}
}
嵌套模型是否需要特殊配置?
答案 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的评论,因为自撰写文章以来它已经发生了变化。