2017-03-10 16 views
0

この質問が以前に尋ねられた場合は申し訳ありません。私はSpringフレームワークを初めて勉強しており、@Transactionalについての実用的な質問があり、問題があります。@ Transactionalでマークされたメソッドからすべてのエラーを返すには?

ループでは、JDBCとSQLストアドプロシージャを使用してデータベースにオブジェクトを挿入しています。一部の/なし/すべてのオブジェクトに対して何らかの理由で挿入が失敗することがあります。すべての挿入にエラーがない場合は、2つのことを行う必要があります。まず成功したすべての挿入をロールバックし、すべてのエラーのリストを返さなければなりません。

これまでのところ、私はロールバックを行うコードを考え出しましたが、エラーのある配列を返す方法を見つけることはできません。

@Transactional 
public String[] insertSomeObjects(SomeObject[] some){ 
    List<String> errors = new ArrayList<String>(); 
    for(SomeObject temp:some){ 
     try{ 
      jdbcInsertFunction(temp); 
     }catch(Exception ex){ // If error occurs, ad it to error list 
      String error = createProperErrorMessage(ex); 
      errors.Add(error); 
     } 
    } 
    if (errors.size >0){ 
     // If there are errors, throw exception and roll back 
     Throw new Exception 
    } 
} 

このコードは正常に動作し、すべてのオブジェクトを挿入し、いずれかが失敗した場合はロールバックします。問題は私がエラーのリストを返すことができないということです。

この問題を解決する方法はありますか?

+0

errors.toArray()を返します。 – user1211

+0

この場合、どのようにロールバックを行いますか? – rob

+0

エラーを例外オブジェクトに入れないのはなぜですか? – kaqqao

答えて

1

あなたはsuppressed例外を使用することができます。

public static void main(String[] args) throws TransactionRolledbackException { 


    TransactionRolledbackException te = null; 

    for (int i = 0; i < 3; i++) { 

     try{ 
      //doStuff 
      throw new NullPointerException("Exception no:" + i); 
     }catch (Exception e) { 
      if(te == null){ 
       te = new TransactionRolledbackException(); 
      } 

      te.addSuppressed(e); 
     } 


    } 


    if(te != null){ 
     throw te; 
    } 
} 

出力:

Exception in thread "main" javax.transaction.TransactionRolledbackException 
    at chapter4.Exceptionsss.main(Exceptionsss.java:18) 
    Suppressed: java.lang.NullPointerException: Exception no:0 
     at chapter4.Exceptionsss.main(Exceptionsss.java:15) 
    Suppressed: java.lang.NullPointerException: Exception no:1 
     at chapter4.Exceptionsss.main(Exceptionsss.java:15) 
    Suppressed: java.lang.NullPointerException: Exception no:2 
     at chapter4.Exceptionsss.main(Exceptionsss.java:15) 
+1

これは実際にはかなりスムーズです!回答ありがとうございます。 – rob

+0

@rob私はそれが助けてうれしいです – HRgiger

0

は、これまでのところ、私はロールバックを行うコードが出ているが、私は返す方法を見つけ出すことはできませんエラーのある配列

エラーを返そうとしても、例外をスローする場合は、List<String> errorsフィールドを持つ独自の例外を書き込むことができます。次に、あなたが行うだろう:あなたが呼び出し元で例外をキャッチすると

throw new ExceptionWithErrors(cause, errors); 

することは、あなたはewe.getErrors()を呼び出すことができます。私は例外にデータを格納しない傾向があります。なぜなら、実際には悪い例がいくつか見受けられますが、エラーの詳細を格納している場合は、このパターンは良いもののようです。

このメカニズムで考えられる問題は、トランザクションの終了がロールバックの原因になっているときに問題が発生したことです。私は例外をスローするときにも問題を抱えていましたが、トランザクションが終了すると別の例外が生成され、最初のものが(エラーコンテキストとともに)失われました。

関連する問題