2014-10-18 89 views
0

我正在用spring + hibernate開發web應用程序。據我所知,最好的做法是將@transactional放入服務層。如果在將數據更新到數據庫時發生任何異常,Spring將拋出DataAccessException。春季例外處理

以下是我的高級班結構。

@Transactional 
class OrderService { 
    public void createOrder() { 
     try { 
      orderDAO.createOrder(); 
     } catch (DataAccessException e) { 
      // convert into business exception and sends back to presentation logic. 
     } 
    } 

} 

這裏發生的是數據訪問異常只有在方法完成後纔會拋出。所以如果發生任何異常,我無法將其轉換爲catch塊中的業務異常。

解決方法是刷新dao方法中的hibernate會話,但我不喜歡這種方法。有沒有更好的方法呢?

+1

您可以使用AOP攔截器,但爲什麼? DataAccessException有什麼問題? Spring已經提供了一個異常層次結構,將您從持久化框架特定的異常類型中分離出來。爲什麼你還想在另一個異常層次上呢? – 2014-10-18 05:59:42

+0

我想爲用戶提供自定義消息。不是春天給的那個。除AOP之外,您還有其他選擇會引發建議嗎? – javafan 2014-10-18 18:52:39

+0

爲什麼你不在UI層捕獲DataException呢?顯示錯誤消息不是服務層的工作。 – 2014-10-18 22:35:19

回答

1

我認爲你使用的是Spring MVC,儘管你沒有指定。如果您使用Spring MVC,那麼有幾個不同的選項。

  1. 您可以創建一個Filter來查找DAE異常,並將其重新編碼爲您的前端可以更好理解的不同狀態或異常。你可以看一下Spring Security的ExceptionTranslationFilter作爲如何,這是已經爲不同的異常
  2. 您可以使用一個SimpleMappingExceptionResolver給特定異常映射到特定視圖做了一個例子。這將允許您的表示層不可知且不需要知道拋出的異常。
  3. 您可以使用@ExceptionHandler特定的控制器內,以處理一般的方式DAE異常,並適當準備一些表示層。
  4. 作爲#3的擴展,您可以使用@ControllerAdvice來管理webapp中任何控制器的所有DAE異常。

有關更多詳細信息,您還可以閱讀Exception Handling in Spring MVC

一般來說,我發現,最好的解決辦法是在一個更高的水平趕上異常交易和操縱信息提交給前端的方式,是後端無關。這使您可以設置自己的錯誤代碼/等。我在服務本身嘗試/捕獲異常的唯一時間是如果我真的想要嘗試重試或根據某些特定異常修改邏輯流程,並且不希望前端知道它。