在Grails应用中,偶尔会在日志中看到“无法发出重定向”:
2011-04-27 12:18:40,469 [TP-Processor13]错误GrailsExceptionResolver - 无法在此处发出重定向(..)。先前对重定向(..)的调用已经重定向了响应。 org.codehaus.groovy.grails.web.servlet.mvc.exceptions.CannotRedirectException:无法在此处发出重定向(..)。先前对重定向(..)的调用已经重定向了响应。 在com.coach.LoginController $ _closure2.doCall(LoginController.groovy:90) ...
不确定如何跟踪此问题。有什么想法或建议吗?
托德
答案 0 :(得分:17)
检查登录控制器;看起来你重定向后没有从动作返回。 E.g :
if (some condition) {
redirect ()
return // should return from here to finish the action, otherwise the rest of the code will be executed
}
答案 1 :(得分:3)
虽然这个问题已经得到解答,但我想我会分享我未来拖网渔船的经验。希望它有所帮助。
这件事发生在我身上,因为重定向后我没有做return
:
if (test) {
flash.message = "Error message."
redirect(action: "list")
}
switch ( params.test ) {
case "value":
redirect(action: "value", id: callInstance.id, version: callInstance.version)
重定向后,如果没有return
,Grails会继续前进。在我的情况下,它点击了switch
并继续进行第二次重定向,这是出现错误的地方。代码应如下所示:
if (test) {
flash.message = "Error message."
redirect(action: "list")
return
}
switch ( params.test ) {
case "value":
redirect(action: "value", id: callInstance.id, version: callInstance.version)
return
此代码当然是匿名的;)
修改的
哎呀。我刚才意识到这是Sachin的回答:/好吧,我将把它作为一个额外的例子。答案 2 :(得分:1)
您只能重定向一次。如果您要从控制器方法A - >移动; B - > C,B应该是一种服务方法,然后将结果传递给控制器方法C,而不是控制器方法。
class TemplateController {
def templateService
def A() {
def results = templateService.B(params.input)
redirect action: 'C', params: ['results': results]
}
def C() {
return params.results
}
}