私はSpring 3.0.5、Hibernate 3.6.7、Atomikos Transactionessentials 3.7.0を使用しています。 applicationContext.xmlでAOPを使用して構成されたトランザクション。 すべてうまく動作します。 (コミット、ロールバック)JTAトランザクションの内部にスローされた例外をキャッチする方法は?
私の意図は、特定の例外をjta-transactionの中に投げることです。 この方法でトランザクションをロールバックし、ロールバックの原因に関する詳細な情報を取得します。
問題は、私が捉えることができる唯一の例外は、トランザクションが予期せずロールバックされたことを示すatomikosによってスローされるロールバックトランザクションです。
トランザクション外で自分の例外をどのようにして得ることができますか?
ここには小さな例があります。私の説明が十分に良いかどうかわからないからです。 これは私の意図が何であるかを実証するためのものです。どんなタイプミスもコメントしないでください。
特定の例外(およびいくつかの標準的な例外であるかもしれない):
public class MySpecialException extends Exception {
public MySpecialException(String someInfo) {
super(someInfo);
}
}
例外をスローする宣言する方法declareingインターフェース:
public interface MyInterface {
Object someJtaTransactionMethod(String param) throws MySpecialException;
}
インタフェースを実装するクラス:
また、関数を呼び出してeをキャッチするコードxceptions。
public class Caller {
@Autowired
private MyInterface callee;
public void test() {
try {
callee.someJtaTransactionMethod("Some test");
} catch (MySpecialException mex) {
// I want to get here
} catch (Exception ex) {
// but I only get here
}
}
}
これはまったく可能ですか?
更新:もちろん、私は例外の原因を見ました。例外自体はorg.springframework.transaction.UnexpectedRollbackExceptionです。原因はクラスjavax.transaction.RollbackTransactionであり、原因はcom.atomikos.icatch.RollbackExceptionです。
atomikosは例外に気付き、ロールバックを行いますが、atomikos(おそらく他のjta実装でも)は、トランザクションがロールバックされた(予期せず)ことを示す例外をスローします。私の例外はなくなった。
更新2:面白いことに、ロールバックする必要のあることを実行していない場合は、必要に応じて例外をキャッチできます。
更新3と解決策:JB Nizetは私に解決策を指摘しました。実際に私のトランザクションは、私が疑ったようにロールバックされていませんでしたが、私が例外を投げる理由のために、私は制約違反を持っていました。したがって、Atomicikosはコミットの例外を投げました。これで、私のトランザクションを、例外のためにロールバックするように設定したので、すべてが期待どおりに機能します。
私はアトミコスを知らないのですが、あなたの例外をキャッチし、自分の原因としてあなた自身のものを投げることができますか?例外のgetCause()メソッドの戻り値を分析しましたか(2番目のcatchから) –
はい私は例外を一度見て(開発中に複数回)、デバッグしようとしましたが、何も見つかりませんでした...更新された投稿 – AlexS
スタックトレースとあなたが使用しているフレームワーク? –