2009-06-24 13 views
2

私は(ローカル)セッションBeanを使用してサービスを公開するJEE5アプリケーションを持っています。RuntimeExceptionの詳細をEJBクライアントから隠すにはどうすればいいですか?

サービス実行中に内部障害が発生すると、RuntimeExceptionがスローされ、JBoss(5.0.1)によってjavax.ejb.EJBTransactionRolledbackExceptionにカプセル化されます。

問題は、このEJBTransactionRolledbackExceptionを受け取ったクライアントアプリケーションが、原因ランタイム例外に関する詳細な情報にアクセスして、アプリケーションの内部アーキテクチャを公開してしまうことです。私はそれを望んでいません。

代わりに、公開されているセッションBeanによってスローされたRuntimeExceptionを常に単一の(そして単純な)TechnicalException(原因なし)にカプセル化したいと思います。

これを達成する最もよい方法は何ですか? (インターセプタの使用?JBoss構成の使用?)

答えて

4

は最後に、前の回答と私の個人的な研究に基づいて、私はfolowingソリューションを保持しました。

public class FaultBarrierInterceptor { 

@AroundInvoke 
public Object intercept(final InvocationContext invocationContext) throws Exception { 
    try { 
     return invocationContext.proceed(); 
    } catch (final RuntimeException e) { 
     final Logger logger = Logger.getLogger(invocationContext.getMethod().getDeclaringClass()); 
     logger.error("A fault occured during service invocation:" + 
       "\n-METHOD: " + invocationContext.getMethod() + 
       "\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e); 
     throw new TechnicalException(); 
    } 
}} 

スロー技術的例外はないEJBExceptionを拡張し、原因のRuntimeException公開しません:私はすべてにこのインターセプタを使用

public class TechnicalException extends EJBException {} 

私は、サーバーの障害を管理するための専用のインターセプターを作成しました公共サービス:

@Stateless 
@Interceptors({FaultBarrierInterceptor.class}) 
public class ShoppingCardServicesBean implements ShoppingCardServices { ... 

これは実装ですFault Barrier patternのn。

実行時例外はすべてキャッチされ、ログに記録され、TechnicalExceptionを使用して(内部の詳細なしで)クライアントに障害が通知されます。チェックされた例外は無視されます。

RuntimeException処理は集中管理され、ビジネスメソッドから分離されています。

1

任意のRuntimeExceptionはjava.lang.Exceptionを拡張します。

EJB仕様は、例外の2種類(アプリケーションおよびシステム)のためのハンドリングを提供

あなたはシステム例外をスローしたい場合は、通常、そのようにそれを行うだろう:

try { 
.... your code ... 
}catch(YourApplicationException ae) { 
    throw ae; 
}catch(Exception e) { 
    throw new EJBException(e); //here's where you need to change. 
} 

へお使いのシステム例外の内部の詳細を隠す、単純に置き換える:

throw new EJBException(e); 

で:

throw new EJBException(new TechnicalException("Technical Fault")); 

これはあなたが探していたものです。

乾杯

関連する問題