Grails 3.3.3+JsonViews 1.2.7下Json视图被忽略及JSON渲染问题求助
我之前在Grails 3.x版本中也碰到过类似的JsonViews不生效的情况,结合你的场景(不用@Resource、手动编写控制器、Customer与Site一对多关联),可以从以下几个关键环节排查解决:
1. 先确认JsonViews依赖配置正确
首先检查build.gradle中是否已经添加了正确的JsonViews依赖,确保没有拼写错误或版本不匹配:
compile "org.grails.plugins:json-views:1.2.7"
如果之前没添加或者依赖有问题,同步依赖后重启应用再测试。
2. 确保视图文件的路径完全正确
Grails的视图解析严格遵循控制器名称对应目录的规则:
- 如果你创建的是
CustomerController,对应的JSON视图必须放在grails-app/views/customer/目录下,文件名必须是index.gson和show.gson(注意是小写的控制器名目录) - 同理,
SiteController的视图要放在grails-app/views/site/下
如果路径或文件名写错,系统会直接忽略这些视图文件,转而使用默认的JSON转换器输出。
3. 控制器动作必须用respond方法触发视图
这是最容易踩坑的点:如果你的控制器里用了render json: ...,会直接绕过JsonViews,用Grails默认的JSON转换器输出。必须使用respond方法返回数据,才会触发视图解析:
示例Customer控制器代码:
class CustomerController { // 列表页动作 def index() { // 自动将集合转换为模型名:customers(复数形式) respond Customer.list() } // 详情页动作 def show(Customer customer) { // 自动将对象转换为模型名:customer(单数形式) respond customer } }
如果需要自定义模型名,可以显式指定:
respond Customer.list(), model: [customerList: Customer.list()]
对应的视图里就要用model { List<Customer> customerList }来接收。
4. 验证JSON视图的语法正确性
视图里的语法错误也会导致视图被忽略(系统会 fallback 到默认JSON输出),给你两个基础的视图示例:
grails-app/views/customer/index.gson(列表视图)
model { List<Customer> customers } json { customers customers.collect { customer -> tmpl.customer(customer) } }
grails-app/views/customer/show.gson(详情视图,包含关联的Site)
model { Customer customer } json { id customer.id name customer.name // 处理一对多关联,自定义输出Site的字段 sites customer.sites.collect { site -> [ id: site.id, address: site.address ] } }
你也可以用模板复用代码,比如创建grails-app/views/customer/_customer.gson模板,然后在index和show里引用,这样更简洁。
5. 检查全局JSON配置是否干扰
如果你的application.groovy里有类似下面的配置,可能会影响JsonViews的触发:
grails.converters.json.default.deep = true
这类全局配置会强制使用默认的JSON转换器,建议暂时注释掉,测试视图是否生效。
按照以上步骤逐一排查,应该就能解决视图被忽略的问题了。
内容的提问来源于stack exchange,提问作者WILLIAM WOODMAN

