0

正在发生以下问题:

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'
}

这会导致抛出异常:

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

奇怪的是我在另一段代码中做了完全相同的事情,而且效果很好。唯一的区别是我是链接而不是重定向。我已经尝试在上面的代码中链接,但它仍然抛出异常。

4

1 回答 1

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'
}

或者只是检查尚未提交响应(但这种方式似乎有点hacky):

if (!response.commited) {
    redirect action: 'success'
}
于 2013-04-01T07:24:18.697 回答