grails:即使我设置了错误,数据也会保存

grails: data saved even if I set an error

我正在使用 grails 2.4.2 并且在我的控制器更新方法中有以下代码:

@Transactional
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) {

    if (ertIncommingInvoiceInstance == null) {
        notFound()
        return
    }

    // Concurrent-Update Test
    if (ertIncommingInvoiceInstance.version != params.version as int) {
        flash.warning = "Another user changed the record! (Concurrent Update Error)"
        ertIncommingInvoiceInstance.errors.rejectValue("ertInfo", "concurrent.update.error")
        respond ertIncommingInvoiceInstance.errors, view:'edit'
        return
    }

即使在这种情况下,检测到错误并设置错误对象并且方法流不执行

    ertIncommingInvoiceInstance.save flush:true, failOnError: true

数据库中的数据已经更改。 显示编辑视图,但不显示错误,仅显示闪现消息。

我的推理错误在哪里?

Grails 将在任何 save 之前调用 validate 并覆盖您在 errors 对象中设置的任何内容。此外,Grails 将在您的方法完成后自动对您的对象调用 save。您应该对已更改但不希望保留的任何对象调用 discard(),或者使用 withTransaction 块创建事务并手动将其回滚。

正如@Gregor Petrin 回答的那样,我现在使用以下代码来检查并发更新并重新显示来自其他用户的更改数据...:

@Transactional
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) {

    if (ertIncommingInvoiceInstance == null) {
        notFound()
        return
    }

    // Concurrent-Update Test
    if (ertIncommingInvoiceInstance.version != params.version as int) {
        ertIncommingInvoiceInstance.discard()
        ertIncommingInvoiceInstance = ErtIncommingInvoice.get(params.id)
        ertIncommingInvoiceInstance.errors.reject("concurrent.update.error")
        respond ertIncommingInvoiceInstance.errors, view:'edit'
        return
    }