Grails - 之前调用重定向(..)已经重定向

时间:2011-04-27 16:27:32

标签: grails

在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) ...

不确定如何跟踪此问题。有什么想法或建议吗?

托德

3 个答案:

答案 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
  }
}