json - Grails 3 响应方法不使用定义的 JSON 编码器格式

标签 json grails controller

我目前使用为每个资源定义自定义 API 响应

JSON.registerObjectMarshaller(Something) { ... }

BootStrap 内部 init关闭。

使用 render something as JSON给我所需的输出。根据编码器设置过滤掉域类的某些属性。

但是,当我使用 时回复 方法,它不使用编码器格式,而是显示域类的所有属性。

Is there any way to make respond use the desired output set up by the marshaller?



Grails 版本:3.2.8

更新:

使用 时似乎出现问题rest-api 轮廓。

最佳答案

当您使用 profile:rest-api 创建 grails 应用程序时会发生此问题。
更准确地说,问题是由 2 个条件引起的:

  • 在 build.gradle 中应用插件:“org.grails.plugins.views-json”。
  • View /对象/_object.gson 存在

  • 如果你深入研究“回应”,你会发现:
    renderer = registry.findRenderer(mimeType, value)
    
    此时,渲染器(Renderer)实例的具体类取决于上述条件是否满足。
  • 如果满足以上条件=> grails.plugin.json.renderer.JsonViewJsonRenderer
  • 否则 => org.grails.plugins.web.rest.render.json.DefaultJsonRenderer

  • (如果您为某个类定义了自定义 json 渲染器类,则该渲染器可能会在此处返回。自定义 json 渲染器与自定义 marshaller 完全不同,因此请忽略此处的大小写。)
    当 renderer == 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)
    }
    
    因此,这会导致与“render --- as JSON”相同的结果。
    另一方面,当 renderer == JsonViewJsonRenderer 时,
    它不是指由 JSON.registerObjectMarshaller 创建的自定义注册编码器,而是指gson View 。
    因此,如果您想启用自定义编码器并保留 gson View 功能,
    快速解决方案是删除_object.gson。
    如果你去掉了views-json插件,那么没有人可以在应用中实现gson View ,这可能会给以后带来不便。

    关于json - Grails 3 响应方法不使用定义的 JSON 编码器格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43357469/

    相关文章:

    c# - Wcf 发送 xml 内容类型而不是 json,

    ios - 从 NSArray 中提取数据

    jquery - 如何禁用<g:submitToRemote/>按钮

    php - 使用 phpmailer 在路由中调用函数

    c++ - 缓解 "type-validate then use"代码重复模式

    grails - GORM 数据服务 VS Grails 服务

    Grails 命名查询不适用于 "in"语句

    java - Spring MVC Controller 返回 HTML

    java - 尝试显示 jsp 时出现 404 错误

    javascript - 如何将 JSON 对象转换为 base64 字符串?