以下问题正在发生:
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如下: 消息:无法在此处发出重定向(..)。响应已由另一个重定向或直接写入响应提交。
奇怪的是,我在另一部分代码中做了完全相同的工作并且完美无缺。唯一的区别是我在链接而不是重定向。我已尝试链接上面的代码,但它仍然抛出异常。
答案 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'
}