Grails 6.2.3中含.gsp后缀的URL无法映射至控制器的问题求助
Grails 6.2.3 带.gsp后缀URL 404问题解决方法
在Grails 6.2.3中,访问类似http://localhost:8080/report/view.gsp?a=b的URL时会返回404错误,无法映射到对应控制器动作,但其他后缀(如.gspx、.abc、.xyz)的URL无需修改配置即可正常路由。默认的UrlMappings.groovy配置看似包含格式参数匹配,但对.gsp后缀无效。
问题原因
Grails 6.x版本默认会将.gsp后缀的请求直接交给视图解析器尝试查找对应的GSP视图文件,而不是通过UrlMappings路由到控制器动作,这是框架默认行为的调整,和旧版本(如3.3)的处理逻辑不同。
解决方案
方案1:添加优先匹配的UrlMapping规则
修改grails-app/controllers/UrlMappings.groovy,在默认映射前添加专门匹配.gsp后缀的规则:
// 优先处理带.gsp后缀的请求 "/$controller/$action.gsp/$id?" { constraints { // 根据需求添加约束,比如限制控制器或动作 } } // 保留原有默认映射 "/$controller/$action?/$id?(.$format)?"{ constraints { // apply constraints here } }
这条规则会优先捕获带.gsp后缀的请求,将gsp识别为格式参数,从而路由到对应的控制器动作。
方案2:禁用GSP后缀的自动视图解析
在application.yml(或application.groovy)中添加配置,让框架不再直接处理.gsp后缀的请求:
- 若使用
application.yml:
grails: views: gsp: suffix: false
- 若使用
application.groovy:
grails.views.gsp.suffix = false
该配置会关闭框架对.gsp后缀的自动视图解析逻辑,让所有带.gsp后缀的请求都通过UrlMappings进行路由。
验证
修改配置后重启应用,再次访问http://localhost:8080/report/view.gsp?a=b,即可正常映射到report控制器的view动作,并且能正确获取请求参数a=b。
内容的提问来源于stack exchange,提问作者Meam
相关产品推荐
相关产品推荐

