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

时间:2016-07-07 10:50:07

标签: grails grails-controller

我使用grails 2.4.2并在我的controller-update方法中使用以下代码:

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

即使在这种情况下,也会检测到错误并设置了errors-object,并且方法流程没有执行

    ertIncommingInvoiceInstance.save flush:true, failOnError: true

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

我的推理错误在哪里?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

正如@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
    }