[英]Catch Hibernate Persistence Exceptions in @Transactional REST service methods
我們正在使用Spring和JPA構建REST服務,其中每個方法都注釋了@Transactional
,因為一個REST調用是一個事務。 現在,如果用戶試圖在具有依賴關系的資源上調用delete,則hibernate將拋出PersistenceException
,導致REST服務器調用以狀態500返回。
我們希望捕獲這些異常並將它們包裝在我們自己的錯誤對象中,該對象將包含自定義錯誤代碼以及orignial消息。
我試着在REST調用中捕獲所有RuntimeExceptions
,然后返回我們的自定義錯誤對象。 然而,這將無法正常工作,因為顯然交易已中止的事實將在我的方法之外處理。
我還嘗試直接在DAO級別捕獲PersistenceException
。 這在我的單元測試中運行良好並沒有改變他們之外的任何東西。 此外,我們的Web容器似乎只是通過拋出DataIntegrityViolationException
而不是PersistenceException
來做自己的事情。 這甚至沒有出現在痕跡中。 作為旁注,這是相當令人困惑的,因為我認為Hibernate會照顧自己的東西。 為什么春天會干擾?
好吧無論如何..我也試過用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
在REST服務方法內部沒有成功。
我在這里不知所措..似乎@Transactional
啟動的交易的錯誤處理只是出於我的手......?! 是否可能是因為注釋創建了一個在不同范圍內處理的代理?
是使用TransactionTemplate
手動處理事務的唯一選項嗎?
我希望在嘗試提交事務時拋出異常。 因此,只要您處於事務內部,就不會獲得異常。
Spring將執行一個名為Exception-Translation的操作,這會將一些(供應商)特定的異常“轉換”為其他一些Spring Exceptions。 我認為這就是你會注意到DataIntegrityViolationException
的原因
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.