2011-08-01 13 views
1

私は初めてSpringを試していますが、@ Transactionalに問題があります。私のアプリでは、例外のログを、例えばmain()までバブリングするのではなく、メソッドに記録する必要がある部分があります。ただし、@Transactionalというラベルの付いたメソッドは、例外が発生した場合にはロールバックされません。例外が発生した場合ので、私の理解から、トランザクションがロールバックされることはありません短い、この文句を言わないの仕事で@Transactionalとログを結合する簡単な方法はありますか?

@Transactional 
public void doStuff() { 
    try { 
     //Do something that might cause an Exception 
    } catch (Exception e) { 
     log.error("Exception when trying to do stuff", e); 
    } 
} 

。私が思い付くことができ

唯一のソリューション:

public void doStuff() { 
    try { 
     doStuff0(); 
    } catch (Exception e) { 
     log.error("Error encountered while attempting to join servers", e); 
    } 
} 

@Transactional 
protected void doStuff0() { 
    //Do something that might cause an Exception 
} 

しかし醜いですが、私は好きではないパターンを使用し、ほぼ倍くらいのコードのように、この例です。

例外をログに記録し、トランザクションをロールバックする別の方法はありますか?

+0

あなたの解決策は、JDKプロキシでは動作しません。 – Affe

答えて

1

は、あなたが欲しいものを行うための簡単な方法は、実際にあります。それはいいアイデアだとき、または脇にそれが適切な場合について建築士の議論、時にはあなたはちょうどそれが:)作業する必要があります。そのよう

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 

簡単。

+0

OMGは、このアプローチは –

+1

がお勧め... [ドキュメント](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html)で推奨されますか? : "非常に単純ですが、このプロセスは非常に侵略的で、Spring Frameworkのトランザクションインフラストラクチャにあなたのコードを緊密に結合します"、 "可能ならば、ロールバックの宣言的アプローチを強くお勧めします。それは、POJOベースのクリーンなアーキテクチャを実現することに直面しています。 .....私はその治療を「推奨」と呼んでいません:) – Affe

+0

あなたは正しいです、私はドキュメントのこのコードを見つけ、これが行く方法だと仮定しました。安心している :-)。 –

0

ただ、例外を再スロー:

@Transactional 
public void doStuff() { 
    try { 
     //Do something that might cause an Exception 
    } catch (Exception e) { 
     log.error("Exception when trying to do stuff", e); 
     throw e; 
    } 
} 
+0

それから、例外は 'main()'やロギングを行う別のメソッドにバブルする可能性があります。つまり、例外は2回記録されます。私は例外がメインやスレッドに到達したときに何が起こるのか正確にはわかりませんが、それは良くないと確信しています – TheLQ

+0

'@ Transactional'ハンドラで捕捉され、記録されます。あなたがそれを望まないなら、アフィの方法はより良いです。 – Dmitri

関連する問題