在当前版本的grails(3.1.1,2016年2月)中,在控制器内部使用forward()会导致堆栈溢出。请注意,使用redirect()工作正常,但我要求URL不能更改。为什么要生成此StackOverflow?
我的确切要求是针对数据库中的列表检查request.forwardURI,如果匹配,则发送该对象的数据(如JSON,XML,HTML),而不更改用户的浏览器URL。因此,我尝试解决此问题的方法是使用自定义404错误处理程序来检查requestURI是否与任何内容匹配,并在这种情况下发出forward()。 (注意:我也尝试在matchAll()拦截器中做同样的事情,但结果相同)。如果我使用redirect()而不是forward(),逻辑效果很好,但是它改变了浏览器URL,这对我来说是不行的 - 我必须保留原始的浏览器URL。
我有a sample application you can run in github来重新创建错误,但相关部分在这里给出。
在UrlMappings.groovy内部,我们将404请求发送到自定义错误处理程序:
...
"404"(controller: 'error', action:'notFound')
...
接下来,在ErrorController.groovy:notFound()中,我们有一些自定义逻辑,在必要时发出转发[不完全是我的要求,但关闭]:
def notFound() {
if( request.forwardURI.contains("foo") ){ // This special case should be forwarded to the foo controller.
log.warn("User requested Foo, sending to FooController...");
forward(controller: 'foo', action: 'index');
return;
}
// Now we can say it is not found for sure, and show error
}
我目前的工作是从我的控制器内部实际发出一个REST调用到另一个控制器并返回数据(避免任何重定向或前向调用),每次我想到它都会让人感到畏缩。
答案 0 :(得分:0)
看起来这是某种bug,上面的代码应该可行。
Graeme已将其作为阻止程序添加到3.0.15。