在
Spring MVC 3.x中,我可以配置ContentNegotiatingViewResolver bean,只需将文件扩展名更改为.json或.xml,即可自动呈现
JSON或XML中的任何给定端点.我假设在Grails中有相同的功能但我找不到它.
我读过的所有内容都说我必须捕获传入的mime类型(使用withFormat),然后在我的每个控制器方法(例如rendering JSON with Grails?)中使用render作为JSON(或等效的)指定JSON输出.在我深入研究并开始向控制器添加JSON特定代码之前,我想我会问这里……
所以我的问题是:我是否可以通过简单地为任何给定的URL添加“.json”文件扩展名(或更改接受标头)来配置Grails 2来自动生成JSON输出?
解决方法
我认为你可以使用
grails filter轻松地使用它
这是我在矿山应用程序中使用OAuth API执行的过滤器,它基于接受头执行xml,json和yalm
class RenderFilters { def grailsApplication def filters = { multiFormat(controller: '*EndPoint',action: '*',search: true) { after = { Map model -> def accepts = request.getHeaders('accept')*.toLowerCase() def out = model.containsKey('out')?model.out:model if(accepts.any{ it.contains('json') }){ render(text: out as JSON,contentType: 'application/json',encoding:"UTF-8") } else if(accepts.any{ it.contains('yaml') }){ render(text: Yaml.dump(out),contentType: 'application/x-yaml;',encoding:"UTF-8") } else if(accepts.any{ it.contains('html') }){ render(text: out as JSON,encoding:"UTF-8") } else if(accepts.any{ it.contains('xml') }){ render(text: out as XML,contentType: 'application/xml',encoding:"UTF-8") } else { render(text: out as JSON,encoding:"UTF-8") } false } before = { def contentType = request.getHeader('Content-Type')?.toLowerCase() if(!contentType) return true if(contentType == 'application/json'){ params.body = JSON.parse(request.reader) } if(contentType == 'application/xml'){ params.body = XML.parse(request.reader) } if(contentType == 'application/x-yaml'){ params.body = Yaml.load(request.reader) } params.body = new TypeConvertingMap((Map) params.body) true } } } }