【问题标题】:grails: data saved even if I set an errorgrails:即使我设置错误也保存数据
【发布时间】:2016-07-07 10:50:07
【问题描述】:

我正在使用 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

数据库中的数据已更改。 显示编辑视图,但不显示错误,只显示 Flash 消息。

我的推理错误在哪里?

【问题讨论】:

    标签: grails grails-controller


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 2022-01-18
        相关资源
        最近更新 更多