2011-04-27 109 views
6

Grails中的应用,偶尔看到在日志 “不能发出重定向”:Grails的 - 以前调用重定向(..)已经重定向

2011-04-27 12:18:40469 [TP-Processor13]错误GrailsExceptionResolver - 无法在此处发出重定向(..)。之前调用重定向(..)已经重定向了响应。 org.codehaus.groovy.grails.web.servlet.mvc.exceptions.CannotRedirectException:无法在此处发出重定向(..)。之前调用重定向(..)已经重定向了响应。 at com.coach.LoginController $ _closure2.doCall(LoginController.groovy:90) ...

不知道如何跟踪它。任何想法或建议?

托德

+0

什么是这里:LoginController.groovy:90 ?? – Gregg 2011-04-27 18:50:35

回答

17

检查登录控制器;好像你没有从重定向后的动作中返回。 例如

if (some condition) { 
    redirect() 
    return // should return from here to finish the action, otherwise the rest of the code will be executed 
} 
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 
    } 
} 
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) 

重定向后,Grails将继续下去,如果没有return。在我的情况下,它遇到了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 

此代码已被匿名的,当然;)

编辑

胡geeze。我刚刚意识到这是Sachin的答案:/好吧,我将把它作为一个额外的例子。