2017-02-20 73 views
0

作爲我的代碼的一部分@Transactional帶註釋的方法。在某些情況下,該方法拋出一個自定義異常並執行回滾。只要發生這種情況,方法調用將導致TransactionSystemException,並且無法獲取原始自定義異常(它不是執行的根本原因)。Spring隱藏了@Transactional方法拋出的RuntimeException

我能以某種方式訪問​​我的方法拋出的原始異常嗎? 我可以阻止Spring拋出TransactionSystemException,但仍然回滾?

@Transactional 
public Association create(Long accountId) { 
    // if association already exists, throw exception 
    throw new ErrorInfoException(ErrorInfo.duplicateAssociation(accountId).info("This Association already exists").build()); 
} 
+0

你可以添加事務性方法,你拋出那些自定義異常? –

+0

@MaciejKowalski我編輯了其中一種方法。他們都非常簡單 – Laures

+0

你如何嘗試從TransactionSystemException檢索根/原始異常? –

回答

1

不知道你是如何管理例外方法之外,但你需要趕上TransactionSystemException,然後在你的情況下調用getApplicationException()作爲您的自定義異常應先對堆棧:

返回此 事務異常之前拋出的應用程序異常(如果有)。

如果由於某種原因,也有一些例外情況在中間,然後去getOriginalException()其中根據規範應:

返回被內未能 拋出,這是第一個例外事務:即應用程序異常(如果有的話)或TransactionSystemException的自身原因。

如果使用Exception的getCause方法,那麼在這種情況下可能不是正確的方法。

+0

不幸的是,ApplicationException爲null,並且OriginalException僅僅是已經是原因的「javax.persistence.RollbackException」。看起來我的自定義異常消失了。 – Laures

相關問題