Grails'无法发出重定向'问题

时间:2013-04-01 07:18:53

标签: grails

以下问题正在发生:

def someAction() {
    ...
    if (someCondition)
        redirect action: 'index'
        return
    }

    if (someOtherCondition)
        redirect action: 'index'
        return
    }

    ...

    redirect action: 'success'
}

这完美无缺。但是,只要我在交易中包装它:

def someAction() {
    MyDomainClass.withTransaction { status ->

        if (someCondition)
            status.setRollbackOnly()
            redirect action: 'index'
            return
        }

        if (someOtherCondition)
            status.setRollbackOnly()
            redirect action: 'index'
            return
        }

        ...

    }

    redirect action: 'success'
}

这会导致抛出异常:

  
    

此处无法发出重定向(..)。响应已经由另一个重定向或直接写入响应提交.Stacktrace如下:     消息:无法在此处发出重定向(..)。响应已由另一个重定向或直接写入响应提交。

  

奇怪的是,我在另一部分代码中做了完全相同的工作并且完美无缺。唯一的区别是我在链接而不是重定向。我已尝试链接上面的代码,但它仍然抛出异常。

1 个答案:

答案 0 :(得分:2)

return来自:

MyDomainClass.withTransaction { status ->

        if (someCondition)
            status.setRollbackOnly()
            redirect action: 'index'
            return   //   <-- !!! this one !!!
        }
}

从闭包块返回,而不是从动作返回。所以它调用redirect action: 'index',退出闭包,然后用另一个重定向执行块:

redirect action: 'success'

最后一个导致此异常。

作为一种解决方法,您可以记住重定向状态并检查最后一步,例如:

boolean redirected = false
MyDomainClass.withTransaction { status ->

        if (someCondition)
            status.setRollbackOnly()
            redirected = true
            redirect action: 'index'
            return
        }
}
if (!redirected) { 
    redirect action: 'success'
}

或者只是检查响应是否尚未提交(但这种方式看起来有点不精确):

if (!response.commited) {
    redirect action: 'success'
}