以下のように @Transactional で注釈が付けられた 1 つのメソッド add() を持つ DAO がある春の Web サービスがあります。
class MyDAOClass {
@Transactional(rollbackFor = Exception.class)
add(){
doAdd1();
doAdd2();
doAdd3();
}
...
doAdd2() throws MyException {
throw new MyException ("My Exception Message");
}
...
}
サービス層:
ここで Web サービスを呼び出すと、サービス レイヤーが内部的にこのクラスの add() メソッドを呼び出します。サービス層は MyException e をキャッチしてメッセージを取得し、マーシャリングしてクライアントに送り返す応答オブジェクトに入れます。しかし、doAdd2() メソッドが例外をスローすると、トランザクションがロールバックされ、「My Exception Message」の代わりに、クライアント側で次のエラー メッセージが表示されます。
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring xml:lang="en">Transaction rolled back because it has been marked as rollback-only</faultstring>
</SOAP-ENV:Fault>