Grails 3 response方法不使用定义的JSON marshaller格式

时间:2017-04-11 22:50:03

标签: json grails controller

我目前使用

为每个资源定义自定义API响应
JSON.registerObjectMarshaller(Something) { ... }

在BootStrap init闭包内。

使用render something as JSON为我提供所需的输出。根据编组设置过滤掉域类的某些属性。

但是,当我使用响应方法时,它不使用marshaller格式,而是显示域类的所有属性。

  

有没有办法让回复使用编组人设置的所需输出?

Grails版本:3.2.8

更新

使用 rest-api 个人资料时似乎出现了问题。

1 个答案:

答案 0 :(得分:2)

使用配置文件创建grails应用程序时会发生此问题:rest-api 更确切地说,问题是由两个条件引起的:

  1. apply plugin:" org.grails.plugins.views-json"在build.gradle。
  2. views / object / _object.gson存在
  3. 如果您深入了解“回复”,您会发现:

    renderer = registry.findRenderer(mimeType, value)
    

    此时,具体类的渲染器(渲染器)实例取决于是否满足上述条件。

    • 如果满足上述条件=> grails.plugin.json.renderer.JsonViewJsonRenderer
    • 否则=> org.grails.plugins.web.rest.render.json.DefaultJsonRenderer

    (如果您为某个类定义了自定义json渲染器类,则可能会返回此渲染器。自定义json渲染器与自定义编组器完全不同,因此请在此处忽略该情况。)

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

    DefaultJsonRenderer.groovy:

    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)
    }
    

    因此,这导致与“JSON'渲染”相同的结果。

    另一方面,当渲染器== JsonViewJsonRenderer时,
    它不是指由JSON.registerObjectMarshaller创建的自定义注册编组器,而是指gson视图。

    因此,如果要启用自定义编组器并保持gson视图功能,请执行此操作 快速解决方案是删除_object.gson。

    如果你删除了views-json插件,那么没有人可以在应用程序中实现gson视图,这可能会在将来造成不便。