簡體   English   中英

在@Transactional REST服務方法中捕獲Hibernate Persistence Exceptions

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM