1

私は、Web レイヤーに Struts2 を、ビジネス レイヤーに Spring を含むアプリケーションを使用しています。また、ビジネス関連の検証エラーを作成するためにすべてのビジネス サービスで使用される BusinessException クラスもあります。これは、Web レイヤーに到達する必要があり、検証メッセージとしてユーザーに表示する必要があります。これは、Action クラスに次のように記述することで簡単に実行できます。

      ClientAction extends ActionSupport throws Exception{
         ....
        try{
            clientService.searchClient();
        }catch(InvalidClientSearchCriteriaException e){
              addActionMessage("Invlid Search Criteria");
        }
        ...

そして、すべてのアクション クラスに同様のコードがあります。ただし、アクション クラスを try catch ブロックで汚染したくありません。代わりに、try catch ブロックを 1 か所に記述し、そこですべての例外を BusinessExceptions としてキャッチし、それらの例外に埋め込まれたメッセージ/エラーからメッセージ/エラーを作成できれば、はるかに優れています。私が考えることができる 1 つのアプローチは、インターセプターまたは事前結果リスナーを使用することでした。しかし、アクションクラスからスローされたBusinessExceptionsをキャッチする以下のようなインターセプターを使用することはできません...

    ExceptionInterceptor extends AbstractInterceptor(ActionInvocation ivocation,...){              
          try{
                    invocation.invoke();
          }catch(Exception e){
              if(e instanceof BusinessException){
                   ActionSupport as = (ActionSupport)invocation.getAction();
                   String message = extractMessagefromException()//--custom method to extract message embedded in exception.  
               as.addActionMessages(message);
      //-- above will not work result has already been rendered right? and hence it wouldn't matter if i add action messages now.
           }
         }                                               
   } 

事前結果リスナーを使用する 2 番目のアプローチは、結果がまだレンダリングされておらず、安全に変更できるため、事前結果リスナーのメソッドに上記のようにアクション メッセージを追加することです。ただし、アクションで例外がスローされた場合、事前結果リスナーが実行されるかどうかはわかりませんか? たとえそうであっても、アクションによってスローされた例外オブジェクトを取得するにはどうすればよいですか?

クラスをtry-catchブロックで乱雑にする必要がない他のアプローチを教えてください

4

0 に答える 0