我目前使用为每个资源定义自定义 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 个条件引起的:
如果你深入研究“回应”,你会发现:
renderer = registry.findRenderer(mimeType, value)
此时,渲染器(Renderer)实例的具体类取决于上述条件是否满足。(如果您为某个类定义了自定义 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/