Spring 控制器中的Grails UnexpectedRollbackException
我的Grails服务调用一个插件,该插件引发运行时异常。在我的情况下,我不关心异常,所以它被吞没了Spring 控制器中的Grails UnexpectedRollbackException,spring,grails,transactions,spring-transactions,Spring,Grails,Transactions,Spring Transactions,我的Grails服务调用一个插件,该插件引发运行时异常。在我的情况下,我不关心异常,所以它被吞没了 MyGrailsService { def myMethod { ... try { //callPlugin } catch (Exception ex) { ... } } } 一切正常,捕获异常并继续处理。然而,在我的控制器中,我有一个catch(T
MyGrailsService {
def myMethod {
...
try {
//callPlugin
} catch (Exception ex) {
...
}
}
}
一切正常,捕获异常并继续处理。然而,在我的控制器中,我有一个catch(Throwable t)
块,我不希望执行它,因为异常被吞没了。结果是执行了catch(Throwable t)
块,因为Grails抛出了一个org.springframework.transaction.UnexpectedRollbackException
我当然不希望它这样做。我想我得到这个是因为插件抛出的异常是运行时,所以Grails回滚事务
我不希望抛出此意外回滚异常
有什么建议吗?我会做的是
class MyService{
static transactional = false
def myMethod {
...
try {
//callPlugin
} catch (Exception ex) {
...
}
}
@Transactional(readOnly = true)
def someMethod {
// Some code here
}
}
上面的代码将使服务中的所有方法都成为非事务性的,并且我们将显式地使我们想要的方法成为事务性的
然而,还有一点需要注意,就是你正在调用的插件的方法,该方法本身可以是一个事务性方法,一旦出错,它可能会回滚并抛出一个意外的回滚异常。因此,如果插件方法是事务性的,您必须检查它一次。我遇到了类似的情况,对此也感到困惑。在我的例子中,这是一个干净实用的解决方案,通过在调用函数之前检查数据来避免首先抛出异常。但很明显,在很多情况下,这是不可能或不可取的。