Grails 4出现“Unable to render errors view”导致无限异常循环问题求助
排查解决建议
1. 优先验证error.gsp的鲁棒性
- 移除error.gsp中所有依赖正常请求上下文的变量调用(比如当前登录用户信息、controller传递的非通用模型参数、请求路径相关的动态参数),补充所有变量的非空判断,可临时上线仅输出固定纯文本的简化版error.gsp观测,确认循环报错是否消失。
- 检查error.gsp是否引入了公用局部模板(如页头、页脚模板),可先将模板内容直接硬编码到error.gsp中,排除模板渲染过程触发异常的可能。
- 确认
application.yml中错误视图的配置是否符合预期,核心参考配置如下:
grails: web: error: mapping: 500: /error whitelabel: enabled: false
2. 提取栈追踪的重复调用链
单条13万行的栈追踪必然存在重复的循环调用片段,可截取栈的前100行和后100行搜索重复调用节点,核心定位GrailsExceptionResolver.resolveException调用到再次触发该方法之间的异常抛出点,判断是GSP解析器还是资源处理器的逻辑导致的循环。
3. 补全全链路请求日志
常规访问日志未记录异常请求,大概率是请求在进入controller层前就已经触发异常,可做如下配置补全日志:
- 开启Tomcat
AccessLogValve的requestAttributesEnabled属性,记录所有经过Tomcat的请求信息 - 新增Grails全局
OncePerRequestFilter,在过滤器最外层打印所有进入应用的请求的请求头、参数、来源IP,覆盖未进入controller层的异常请求场景
4. 验证Grails 4.0.x已知bug
Grails 4.0.10存在已知的GSP错误视图渲染循环漏洞:当异常发生在静态资源请求处理流程时,异常处理器会尝试渲染GSP错误视图,但静态资源请求的上下文不支持GSP渲染,会再次抛出异常触发死循环。可通过如下两种方式修复:
方式1:在resources.groovy中配置排除静态资源路径的异常处理
beans = { exceptionResolver(GrailsExceptionResolver) { excludedPaths = ['/static/', '/assets/'] } }
方式2:直接将Grails版本升级到4.0.13,该版本已修复此问题。
内容的提问来源于stack exchange,提问作者sodastream
相关产品推荐
相关产品推荐

