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'

最後の 1 つは、この例外を引き起こします。

回避策として、次のように、リダイレクトの状態を記憶して最後のステップを確認できます。

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'
}
于 2013-04-01T07:24:18.697 に答える