Grails3响应方法不';t使用定义的JSON封送器格式
我目前使用Grails3响应方法不';t使用定义的JSON封送器格式,json,grails,controller,Json,Grails,Controller,我目前使用 JSON.registerObjectMarshaller(Something) { ... } 在引导initclosure内部 使用将某物呈现为JSON可以获得所需的输出。域类的某些属性将根据封送拆收器设置过滤掉 但是,当我使用respond方法时,它不使用marshaller格式,而是显示域类的所有属性 有没有办法让响应使用封送员设置的所需输出 Grails版本:3.2.8 更新: 使用restapi配置文件时似乎会出现问题。使用profile:restapi创建grails
JSON.registerObjectMarshaller(Something) { ... }
在引导init
closure内部
使用将某物呈现为JSON
可以获得所需的输出。域类的某些属性将根据封送拆收器设置过滤掉
但是,当我使用respond方法时,它不使用marshaller格式,而是显示域类的所有属性
有没有办法让响应使用封送员设置的所需输出
Grails版本:3.2.8
更新:
使用restapi配置文件时似乎会出现问题。使用profile:restapi创建grails应用程序时会出现此问题。
更准确地说,问题是由两种情况引起的:
renderer = registry.findRenderer(mimeType, value)
此时,渲染器实例的具体类取决于是否满足上述条件
- 如果满足上述条件=>grails.plugin.json.renderer.JsonViewJsonRenderer
- 否则=>org.grails.plugins.web.rest.render.json.DefaultJsonRenderer
它不是指由
JSON.registerObjectMarshaller
创建的自定义注册封送器,而是指gson视图
因此,如果要启用自定义封送拆收器并保持gson视图功能,快速解决方案是删除_object.gson
如果您删除了views json插件,则没有人可以在应用程序中实现gson view,这可能会给将来带来不便。我认为这样做的新“grails方式”是使用他们的json视图。我在两个不同的grails项目中使用自定义对象封送器,它们都使用render函数而不是respond函数。你为什么选择使用respond vs render?@zypherman如果我使用respond,代码会更少。因为其他项目中的一些现有代码使用respond。我想知道Json视图是否可以以同样的方式使用,包括用于包含嵌套资源的资源?看起来您可以进行深度渲染,以渲染嵌套资源。JSON视图文档不是非常详细,但我相信您能够指定您希望输出的外观,就像在对象封送器闭包中那样。那么我应该停止使用JSON视图吗?所以问题是rest api概要文件生成的文件
grails app/views/object/_object.JSON
,而不是注册的json封送员。解决方法是删除该文件。那样的话,回复应该很好,对吗@hitokun-s?是的,你是对的。我在我的演示应用程序中检查了同样的情况。请在您的应用程序中尝试。@toshi此解决方案在grails 4.0.1中不适用于我。我删除了_object.json,但是,我的respond具有renderer==JsonViewJsonRenderer。我需要renderer==DefaultJsonRenderer来处理所有响应调用。关于如何使其与4.0.1一起工作的任何想法。
protected void renderJson(T object, RenderContext context) {
JSON converter
if (namedConfiguration) {
JSON.use(namedConfiguration) {
converter = object as JSON
}
} else {
converter = object as JSON
}
renderJson(converter, context)
}