2017-08-07 17 views
1

私はコンテナ管理のトランザクションを持つEJBを持っています。私はJNDIを使って注入した別のEJBから何かを呼び出すメソッドを(REST呼び出しとして)使用し、RuntimeExceptionを継承するExceptionを返す(トランザクションのロールバックを引き起こす) ExceptionMapperを介して404応答として変換されます。Payaraでトランザクションを静かにロールバックする

私は、REST呼び出しから返されるものが例外であり、ログにはまったく気にしませんが、私のログは、原因となるEJBExceptionRolledBackExceptionスタックトレースでスパムされたくありません。何らかの理由で3回印刷される)。これらの3つのスタックトレースのうち2つは、サーバがRESTコールの最終メソッドに戻る前に記録されると考えられます。

どちらの方法でも、これらのロギングアクションを抑制する方法を見つけ出す限り、3つすべてを停止する方法がわかります。誰もこの種のロギングを抑制する方法を知っていますか?

答えて

1

EJB仕様で述べたように、SystemExceptionはすべて、コンテナ実装によって記録されなければなりません。それをキャッチしようとするか、ApplicationExceptionというマークを付けることができますが、マークすると、トランザクションはロールバックされません。私はこれをお勧め:

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
public class MyBean { 

    @Resource 
    private UserTransaction tx; 

    public void myMethod() throws MyApplicationException { 
     try { 
      tx.begin(); 
      // call needed methods 
      tx.commit(); 
     } catch(Exception e) { 
      // silently rollback; 
      // exceptions from `UserTransaction` omitted for readability 
      tx.rollback(); 
      throw new MyApplicationException(e); 
     } 
    } 
} 

は、今では、EJBのクライアントコードで、あなたはMyApplicationExceptionに反応して、必要なものは何でも返すか、それを記録したりしないでくださいすることができます。コンテナ管理のトランザクションを使用することで、エラーによって仕様が記録されます(Beanインスタンスが破棄されると別の例外にもラップされます)。また、トランザクションをロールバック専用としてマークすることもできます。注意して使用してください。コンテナからのログを必要としない場合は、自分ですべてのフローを制御する必要があります。

+0

ありがとうございます!私は、これがすべてロギングだけで、それ以外は何も起こっていないので、トリガーできる何らかのログフラグがあることを期待していましたが、これを処理する方法を変更する方法を検討します。 コンテナ管理のトランザクションを保持していて、何かをコミットせずにApplicationExceptionをスローすると、うまくいくことがわかります。そして、そのメソッドがその例外をスローすることを指定すると、そのメソッドを呼び出す処理が強制され、必要に応じてトランザクションをロールバックすることを忘れないでください。 – SpooXter

+0

トランザクションに関する仕様を確認することをお勧めします。それは読む価値がある) –

関連する問題