1

@Transactional1 つの REST 呼び出しが 1 つのトランザクションであるため、Spring と JPA を使用して各メソッドにアノテーションが付けられた REST サービスを構築しています。ユーザーが依存関係を持つリソースで削除を呼び出そうとすると、hibernate は をスローしPersistenceException、REST サーバー呼び出しがステータス 500 で返されるようにします。

これらの例外をキャッチし、カスタム エラー コードと元のメッセージを含む独自のエラー オブジェクトにラップします。

RuntimeExceptionsREST 呼び出しで単純にすべてをキャッチしてから、カスタム エラー オブジェクトを返すようにしました。ただし、トランザクションが中止されたという事実は私の方法の外で処理されるように見えるため、それは機能しません。

PersistenceExceptionまた、DAOレベルで直接キャッチしようとしました。これは私の単体テストでは問題なく機能し、それらの外では何も変更されませんでした。DataIntegrityViolationExceptionまた、Web コンテナーは、 の代わりに をスローすることで、独自の処理を行っているようPersistenceExceptionです。それはトレースにも表示されません。補足として、Hibernate が独自のものを処理すると思っていたので、これはややこしいことです。スプリングが干渉するのはなぜですか?

まあとにかく..私も使ってみました

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

RESTサービスメソッド内で成功しませんでした。

私はここで途方に暮れています.. によって開始されたトランザクションのエラー処理@Transactionalは私の手に負えないようです..?! アノテーションが別のスコープで処理されるプロキシを作成するためでしょうか?

を使用してトランザクションを手動で処理する唯一のオプションTransactionTemplateですか?

4

1 に答える 1

4

トランザクションをコミットしようとすると、例外がスローされることを期待しています。したがって、トランザクション内にいる限り、例外は発生しません。

Spring は Exception-Translation と呼ばれる処理を行います。これは、一部の (ベンダー) 固有の例外を他の Spring Exceptions に「変換」します。これがあなたが気付く理由だと思いますDataIntegrityViolationException

于 2012-10-30T12:27:15.513 に答える