7

アプリケーションでは JSF、Spring、および JPA を使用しています。プロジェクトの例外処理戦略を簡素化しようとしています。

私たちのアプリケーション アーキテクチャは以下のようなものです。

UI(JSF) --> Managed Beans --> サービス --> DAO

DAO レイヤーに Exception Translation bean ポスト プロセッサを使用しています。これは、Spring Application Context ファイルで構成されます。

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

Spring はすべてのデータベース例外を「org.springframework.dao.DataAccessException」にラップします。DAO レイヤーでは、その他の例外処理は行っていません。

以下のような例外を処理するための戦略:

プレゼンテーション層:

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
 }

}

質問: 上記のアプローチがベスト プラクティスに従っているかどうかを確認したいだけです。そうでない場合は、例外を処理する最善の方法を提案してください (トランザクション管理で遊んでください)。

4

5 に答える 5

1

このアプローチは私には良さそうです。私たちのプロジェクトでも同じ種類のアプローチを使用しています。

ビナイ

于 2013-02-18T10:46:49.420 に答える
0

私自身がこれについて混乱していたので、私はいくつかの調査を行っていました。しかし、私は少し違う見方をしています。

理論的根拠は、複数のレイヤーで例外をスローしてキャッチすると、パフォーマンスとコードの読みやすさの点でコストがかかるということです。重要なのは、サービス メソッドが例外をスローしてはならないということです。代わりに、ステータス、メッセージ、および出力エンティティをカプセル化する応答を常に返す必要があります。

ただし、コントローラーが複数のサービス メソッドを呼び出し、応答の組み合わせに基づいて描画を試みる場合、それを try catch ブロックに入れて例外を処理できます。

このロジックにより、スプリント mvc とレスト 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)

于 2015-01-26T16:22:42.310 に答える
0

あなたのアプローチは、Spring Frameworks の推奨事項と非常に一致しており、アプリケーションのレイヤー全体に多数のチェック例外が浸透することも回避しています。

于 2013-06-12T17:12:56.137 に答える