Grails v3.3.3中如何使Json Api渲染与json views协同工作
我之前也碰到过类似的JSON API渲染不生效的问题,结合你描述的场景,给你梳理几个关键排查点和解决方案:
1. 确认域类的REST注解配置是否正确
首先要确保你的JsonApiBook域类上的@Resource注解配置到位,尤其是指定了json-api格式,这是触发JSON API渲染的核心:
import grails.rest.Resource @Resource(uri='/jsonApiBooks', formats=['json-api']) class JsonApiBook { String name static constraints = { name nullable: false } }
注意这里的formats参数必须包含'json-api',如果只写['json'],Grails只会返回普通JSON格式,不会触发JSON API规范的渲染。
2. 检查自定义视图的文件名和结构
你提到在views/jsonApiBook下创建了视图文件,这里要注意两个关键点:
- 视图文件必须以
.gson为后缀(不是.gsp),比如对应show动作的show.gson,对应index动作的index.gson - 视图内容要严格遵循JSON API规范,比如
show.gson的示例写法:
model { JsonApiBook jsonApiBook } json { data { id jsonApiBook.id type "jsonApiBooks" // 这里要和域类@Resource的uri复数形式一致 attributes { name jsonApiBook.name } } }
如果视图结构不符合JSON API要求,渲染出来的内容会不符合预期甚至报错。
3. 验证请求头是否符合JSON API要求
JSON API规范要求请求的Accept头必须是application/vnd.api+json,很多人会忽略这一点,直接用application/json请求,导致Grails不触发JSON API渲染。
比如用curl测试的话,要加上这个头:
curl -H "Accept: application/vnd.api+json" http://localhost:8080/jsonApiBooks/1
如果用Postman等工具,也要在请求头里设置Accept: application/vnd.api+json。
4. 确认依赖是否正确引入
Grails 3.3.x的JSON API支持通常需要引入专门的插件,你可以检查build.gradle文件里是否有以下依赖:
compile "org.grails.plugins:json-api:1.0.12"
如果没有的话,添加后重新运行grails compile或者./gradlew compile加载依赖。
5. 排查Bootstrap数据是否正确保存
确保Bootstrap里的图书实例确实成功保存到数据库了,建议加上failOnError: true来快速发现保存失败的问题:
class BootStrap { def init = { servletContext -> if (!JsonApiBook.count()) { new JsonApiBook(name: "Grails JSON API Guide").save(failOnError: true) } } def destroy = { } }
启动项目时如果控制台没有报错,说明数据保存成功。
6. 避免手动创建控制器覆盖自动生成的REST接口
@Resource注解会自动为域类生成REST风格的控制器,如果你手动创建了JsonApiBookController,可能会覆盖自动生成的逻辑,导致JSON API渲染不生效。可以先注释掉手动创建的控制器,测试自动生成的接口是否正常。
7. 开启debug日志排查细节
如果以上步骤都没问题还是不行,可以开启JSON API相关的debug日志,在grails-app/conf/logback.groovy里添加:
logger("grails.plugin.jsonapi", DEBUG, ["STDOUT"], false)
启动项目后,观察请求时的日志输出,能帮你定位到是请求识别问题、视图加载问题还是数据处理问题。
内容的提问来源于stack exchange,提问作者WILLIAM WOODMAN

