我目前使用
为每个资源定义自定义API响应JSON.registerObjectMarshaller(Something) { ... }
在BootStrap init
闭包内。
使用render something as JSON
为我提供所需的输出。根据编组设置过滤掉域类的某些属性。
但是,当我使用响应方法时,它不使用marshaller格式,而是显示域类的所有属性。
有没有办法让回复使用编组人设置的所需输出?
Grails版本:3.2.8
更新
使用 rest-api 个人资料时似乎出现了问题。
答案 0 :(得分:2)
使用配置文件创建grails应用程序时会发生此问题:rest-api 更确切地说,问题是由两个条件引起的:
如果您深入了解“回复”,您会发现:
renderer = registry.findRenderer(mimeType, value)
此时,具体类的渲染器(渲染器)实例取决于是否满足上述条件。
(如果您为某个类定义了自定义json渲染器类,则可能会返回此渲染器。自定义json渲染器与自定义编组器完全不同,因此请在此处忽略该情况。)
当渲染器== DefaultJsonRenderer时,渲染逻辑最终转到:
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视图,这可能会在将来造成不便。