Grails forward()导致StackOverflow错误

时间:2016-02-10 15:25:17

标签: grails

在当前版本的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调用到另一个控制器并返回数据(避免任何重定向或前向调用),每次我想到它都会让人感到畏缩。

1 个答案:

答案 0 :(得分:0)

看起来这是某种bug,上面的代码应该可行。

Graeme已将其作为阻止程序添加到3.0.15。