Grails,抛出异常后保存域 class

Grails, save domain class after exception has been thrown

使用 grails 3.3.8

任何 domainclass.save(flush:true,failOnError:true) 如果在发出保存的服务方法中抛出捕获的异常,则不会保存。即

try {
    //some code that throws exception
} catch (Exception exception) {
    print 'some message'
}

domainclass.save(flush:true,failOnError:true)

我找到了解决上述问题的方法。如果您提取您的 try catch 块并将其放入不同的方法中,域 class 保存确实会保留。

callMethodThatContainsTryCatch()
domainClass.save()

而不是

try {
} catch (Exception exception) {
    println "some exception"
}

domainClass.save()

然后您的方法中的任何异常都会回滚该方法中的所有 gorm 事务。

好吧,在 Grails 3.1 之前,服务默认是事务性的,从 Grails 3.1 开始,它们只有在应用 @Transactional 注释时才具有事务性。

如果您在触发异常时使用事务服务,事务将被标记为执行回滚。同时,当事务回滚时,GORM 使用的 Hibernate 会话被清除。

我假设您的服务被标记为 @Transactional。这就是您的域未被保存的原因。要避免上述行为,您可以将您的服务标记为 @NotTransactional。这将为您提供对服务方法的更多控制,请注意它不再是事务性的。并且抛出异常后不会清除 GORM 会话。

编辑: 因为您正在调用 .save(),所以强烈建议在事务内进行。然后您可以使用 withTransaction(Closure) 方法。