Grails forward()导致堆栈溢出错误

Grails forward()导致堆栈溢出错误,grails,Grails,在当前版本的grails(3.1.11916年2月)中,在控制器内部使用forward()会导致堆栈溢出。请注意,使用redirect()可以很好地工作,但我有一个要求,URL不能更改。为什么会产生堆栈溢出 我的确切要求是对照数据库中的列表检查request.forwardURI,如果匹配,则在不更改用户浏览器URL的情况下将该对象的数据发送回(JSON、XML、HTML)。因此,我试图解决这个问题,使用一个自定义的404错误处理程序来检查requestURI是否匹配任何内容,并在这种情况下发出

在当前版本的grails(3.1.11916年2月)中,在控制器内部使用forward()会导致堆栈溢出。请注意,使用redirect()可以很好地工作,但我有一个要求,URL不能更改。为什么会产生堆栈溢出

我的确切要求是对照数据库中的列表检查request.forwardURI,如果匹配,则在不更改用户浏览器URL的情况下将该对象的数据发送回(JSON、XML、HTML)。因此,我试图解决这个问题,使用一个自定义的404错误处理程序来检查requestURI是否匹配任何内容,并在这种情况下发出forward()。(注意:我也尝试过在matchAll()拦截器中执行相同的操作,但得到了相同的结果)。如果我使用redirect()而不是forward(),逻辑效果会很好,但它会更改浏览器URL,这对我来说是不可能的-我必须保留原始的浏览器URL

我必须重新创建bug,但相关部分在这里给出

在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调用,并返回数据(避免任何重定向或转发调用),这会使我每次想到它都感到畏缩。

看起来这是某种错误,上面的代码应该可以工作


Graeme将其作为一个拦截器添加到3.0.15中。

看起来这是某种bug,上面的代码应该可以工作


Graeme已将其作为拦截器添加到3.0.15中。

如果使用
重定向()
,它能找到该页面吗?StackOverflow很可能是由于它处于无限循环/递归中而导致的。它无休止地试图找到一个控制器,仍然得到一个404,使用相同的方法等等。(这就是我添加上一行的原因,因此它可能不再将其视为404)@Ivar它可以使用redirect()找到页面,并且一切都像您期望的那样工作。唯一的缺点是它违反了我的URL不更改的要求。如果有人关心我在grails core上打开的bug,那么:如果你使用
redirect()
,它能找到那个页面吗?StackOverflow很可能是由于它处于无限循环/递归中而导致的。它无休止地试图找到一个控制器,仍然得到一个404,使用相同的方法等等。(这就是我添加上一行的原因,因此它可能不再将其视为404)@Ivar它可以使用redirect()找到页面,并且一切都像您期望的那样工作。唯一的缺点是它违反了我的URL不更改的要求。如果有人关心,这里是我在grails core上打开的错误:如果有人关心,根据我的测试,它在3.1.2中得到了解决。如果有人关心,根据我的测试,它在3.1.2中得到了解决。