Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails3响应方法不';t使用定义的JSON封送器格式_Json_Grails_Controller - Fatal编程技术网

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应用程序时会出现此问题。
更准确地说,问题是由两种情况引起的:

  • 在build.gradle中应用插件:“org.grails.plugins.views json”
  • 视图/object/_object.gson已存在
  • 如果您深入“响应”,您将发现:

    renderer = registry.findRenderer(mimeType, value)
    
    此时,渲染器实例的具体类取决于是否满足上述条件

    • 如果满足上述条件=>grails.plugin.json.renderer.JsonViewJsonRenderer
    • 否则=>org.grails.plugins.web.rest.render.json.DefaultJsonRenderer
    (如果您为某个类定义了自定义json呈现器类,该呈现器可能会在此处返回。自定义json呈现器与自定义封送器完全不同,因此请忽略此处的大小写)。

    当renderer==DefaultJsonRenderer时,渲染逻辑最终转到:

    DefaultJsonRenderer.groovy: 因此,这将导致与“呈现为JSON”相同的结果

    另一方面,当renderer==JsonViewJsonRenderer时,
    它不是指由
    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)
    }