2016-08-10 19 views
0

サービスレイヤでは、トランザクションアノテーションを持つメソッドがあります。問題がある場合は、そこにロールバックされている...と何もDBに保存されていないようですが、思えトランザクションロールバックと情報の保存

@Transactional 
public void process() throws ProcessPaymentException{ 
    try{ 
    .... do some operation 
    catch (ProcessPaymentException ppe) { 
     save db problem issue. 
    } 
} 

...

ProcessPaymentExceptionは例外

を拡張ロールバックする方法はあります試しにプロセスが、キャッチで保存を行うには? try-catchのプロセスが同じトランザクションで包まれているので、このリンクは https://www.credera.com/blog/technology-insights/java/common-oversights-utilizing-nested-transactions-spring/

+0

私のコード –

+0

を更新しました。デフォルトのロールバックの実装を上書きする必要があります。 ** @ Transactional **に** rollbackfor **という名前のann属性があります。新しいトランザクションを実装しようとすることができます。 Oherオプションは、アスペクトを実装し、例外の側面を実装する必要があります。 – duardito

答えて

0

OKであれば

編集

ネストされたトランザクションが解決策になる可能性があります。 トランザクションマネージャは、例外がスローされるたびにロールバックします。だから、物事は救われないでしょう。

試しにプロセスをロールバックする方法はありますか?キャッチで保存しますか?

はい。ロールバック後にDBの問題を保存するために例外ハンドラを作成します。 これはアイデア

@ControllerAdvice 
public class HandlerName { 
    @ExceptionHandler(ProcessPaymentException.class) 
    public void saveDbIssue(ProcessPaymentException ex) { 
     // save db problem issue. 
} 

である。しかしuは、静的なデータを保存したい場合にのみ動作します。

+0

このメソッドまたは文字列のリストに文字列を渡すことはできませんか? –

+0

ProcessPaymentExceptionのコンストラクタに文字列を渡してから、** saveDbIssue **メソッドのパラメータとして文字列を渡すことができます。 –

+0

私は 'ControllerAdvice'が' Controller'の例外ハンドラのためだと考えています。すなわちOPのサービスに対する着信要求が「コントローラ」を経由して来ない場合、このアプローチは機能しない。 –

0

通常の設定では、ControllerAdviseの既存の回答は、着信リクエストがSpring MVC(つまり、Controllerを経由して来る)に役立つはずです。

ではないか、Spring MVCのにロジックを扱うあなたの例外を結ぶにしたくない場合のために、ここで私は

を考えることができるいくつかの選択肢がある(ここで私はあなたの代わりに、宣言的トランザクション制御に依存するとします

  1. 別々のトランザクションでエラーを保存するためにサービスとコンポーネントを分けてください。

    つまり、伝播によって独自のトランザクションを作成する別のサービスを持つことができます。REQUIRES_NEW。例えばさらに一歩

    @Service 
    public class FooService 
        @Inject 
        private ErrorAuditService errorAuditService; 
    
        @Transactional 
        public void process() throws ProcessPaymentException{ 
         try{ 
         .... do some operation 
         catch (ProcessPaymentException ppe) { 
          errorAuditService.saveErrorAudit(ppe.getErrorText()); 
          throw ppe; // I guess you want to re-throw the exception 
         } 
        } 
    } 
    
    
    @Service 
    public class ErrorAuditService 
        @Transactional(propagation=REQUIRES_NEW) 
        public void saveErrorAudit() { 
         // save to DB 
        } 
    } 
    
  2. 、エラーが異なるサービスのために同じことを取り扱う場合は、serviceメソッドが例外をスローしたときに呼び出されるアドバイスを、作成することができます。その助言では、エラーをdb(ErrorAuditServiceを使用)で保存し、例外を再発行することができます。

関連する問題