簡體   English   中英

Spring / JPA / JSF的異常處理策略

[英]Exception Handling Strategy with Spring/JPA/JSF

我們在我們的應用程序中使用JSF,Spring和JPA。 我們正在努力簡化我們項目的異常處理策略。

我們的應用程序架構如下:

UI(JSF) - >托管豆 - >服務 - > DAO

我們正在為DAO層使用Exception Translation bean后處理器。 這是在Spring Application Context文件中配置的。

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

Spring將所有數據庫異常包裝到'org.springframework.dao.DataAccessException'中。 我們沒有在DAO Layer中進行任何其他異常處理。

我們處理以下異常的策略:

表示層:

Class PresentationManangedBean{

 try{
      serviceMethod();
   }catch(BusinessException be){
      // Mapping exception messages to show on UI
   }
   catch(Exception e){
       // Mapping exception messages to show on UI
   }

}

服務層

@Component("service")
Class Service{

 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = BusinessException.class)
 public serviceMethod(){

  try{

      daoMethod();

   }catch(DataAccessException cdae){
      throws new BusinessException(); // Our Business/Custom exception
   }
   catch(Exception e){
      throws new BusinessException();  //  Our Business/Custom exception
   }
 }

}

DAO層

@Repository("dao")
Class DAO{

 public daoMethod(){
  // No exception is handled
  // If any DataAccessException or RuntimeException is occurred this 
  // is thrown to ServiceLayer
 }

}

問題:我們只想確認上述方法是否符合最佳實踐。 如果沒有,請告訴我們處理異常的最佳方法(玩交易管理)?

這種方法對我來說很好。我們在項目中使用相同的方法。

維奈

我使用不同的方法:

- 我沒有在DAO中捕獲Spring的DAE。 我讓它們流向Controller(JSF托管bean)。

- 在控制器中我捕獲任何異常(只有一個“捕獲”)。

-I調用一個自定義的“handleException”方法,該方法接收參數中捕獲的異常。

- 此異常處理程序檢查(例如,使用“if-then-else”語句)參數是什么類型的異常,並根據該類異常向用戶顯示消息。 在我的情況下,我查找要在屬性文件中顯示的消息,其中消息的鍵(以及args,如果有的話)是異常的屬性(當我拋出它時我把它們放在那里)。 特別是,如果你想以一種特殊的方式處理DAE,你可以在這個異常處理程序方法中為它設置一個“if”分支,並用它做任何你想做的事情。

我認為這種方法更好更清晰,因為你只需要一點處理異常處理,而且你不必在每個級別中放置那么多“throws-try-catch”,只需要在Controller(JSF)中。

當然,如果在特定情況下您想要做的是某些業務邏輯,而不是向用戶顯示消息,則可以在服務中使用“try-catch”來處理特定異常。

而且,如果您不想在控制器中處理Spring DAE,您可以將其包裝到您自己的業務異常中並重新拋出。 但是在服務層執行此操作,而不是在DAO中執行此操作。

希望這個答案有所幫助

您的方法非常符合Spring Frameworks建議,並且還可以避免在應用程序的各個層中滲透大量已檢查的異常。

也許你可以分離BusinessException和BusinessRuntimeException,因為當你捕獲拋出BusinessException的BusinessException但是當你得到Exception時,你仍然會拋出相同的BusinessException。 試着分開他們。 順便說一下,為什么在捕獲BusinessException時會拋出相同的異常?

我正在做一些研究,因為我自己對此感到困惑。 不過我的看法略有不同。

理由是,在性能和代碼可讀性方面,在多個層上拋出和捕獲異常代價很高。 Crux是服務方法不應該拋出異常。 相反,他們應該總是返回一個應該封裝狀態,消息和輸出實體的響應。

但是,如果Controller調用多個服務方法並嘗試根據響應組合進行繪制,則可以將其放在try catch塊中並處理異常。

有了這個邏輯,它可以同等地處理sprint mvc和rest mvc。 讓我知道你的想法。

Class PresentationManangedBean{
      try {
      Response resp1 = serviceMethod();
      if (resp1.getStatus().equals("SUCCESSFUL"))
           // handle UI painting logic.
      else
           // handle error for UI
      Response resp2 = serviceMethod2();
      if (resp.getStatus().equals("SUCCESSFUL"))
           // handle UI painting logic.
      else
           // handle error for UI
      // handle resp1 and resp2 to paint UI.  
     } catch (Exception e) {
           // handle error for UI 
     }
}

1)服務應處理所有異常。 控制器不應處理任何異常。 2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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