RuntimeExceptionの詳細をEJBクライアントから隠す方法は?
質問
(ローカル)セッションBeanを使用してサービスを公開するJEE5アプリケーションがあります。
サービスの実行中に内部エラーが発生すると、RuntimeExceptionがスローされ、JBoss(5.0.1)によってjavax.ejb.EJBTransactionRolledbackExceptionにカプセル化されます。
問題は、このEJBTransactionRolledbackExceptionを受け取ったクライアントアプリケーションが原因のランタイム例外に関する詳細な情報にアクセスして、アプリケーションの内部アーキテクチャを公開できることです。そして、私はそれを望んでいません。
代わりに、公開されたセッションBeanによってスローされたRuntimeExceptionを常に単一の(そして単純な)TechnicalExceptionにカプセル化します(原因はありません)。
これを達成する最良の方法は何ですか? (インターセプターの使用?JBoss設定の使用?)
解決
最後に、以前の回答と私の個人的な調査に基づいて、次の解決策を保持しました。
サーバー障害の管理専用のインターセプターを作成しました:
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 { ...
これは、障害の実装です。バリアパターン。
すべてのランタイム例外がキャッチされ、ログに記録され、TechnicalExceptionを使用して(内部詳細なしで)クライアントに障害が通知されます。チェックされた例外は無視されます。
RuntimeException処理は集中化され、ビジネスメソッドから分離されています。
他のヒント
任意の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);
with:
throw new EJBException(new TechnicalException("Technical Fault"));
これがあなたが探していたものだと思います。
乾杯