2

(ローカル) セッション Bean を使用してサービスを公開する JEE5 アプリケーションがあります。

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

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

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

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

4

2 に答える 2

4

最後に、以前の回答と私の個人的な調査に基づいて、次の解決策を保持しました。

サーバー障害の管理専用のインターセプターを作成しました。

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 パターンの実装です。

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

RuntimeException の処理は一元化され、ビジネス メソッドから分離されています。

于 2009-06-30T12:44:27.803 に答える
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"));

これがあなたが探していたものであることを願っています。

乾杯

于 2009-06-25T03:59:01.150 に答える