2011-01-28 38 views
3

私はJPA toplink-essentialを使用しており、REST Webアプリケーションを構築しています。サーブレットレベルでOptimisticLockExceptionを捕まえるには?

私は1つのエンティティを見つけて削除するサーブレットを持っています。

以下のコード私は、サーブレットレベルで楽観的なロック例外を捕まえることができると思っていましたが、そうではありません! 代わりにRollbackExceptionがスローされ、それはドキュメントの内容です:

しかし、Netbean IDE GlassFishログが表示されたら、どこかでoptimisticLockExceptionがスローされます。それは私のコードで捕らえられていないだけです。 (私のシステムのプリントメッセージが表示されないので、そこには入っていないと確信しています)

私は各パッケージを一度にインポートしようとしましたが、catch節でテストしましたが、ログエラーが "楽観的な例外"と言われてもcatchブロックには入りません。

import javax.persistence.OptimisticLockException; 
import oracle.toplink.essentials.exceptions.OptimisticLockException; 

したがって、OptimisticLockExceptionがスローされる場所?????

@Path("delete") 
@DELETE 
@Consumes("application/json") 
public Object planDelete(String content) { 

    try { 
      EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 

      EntityTransaction txn = em.getTransaction(); 
      txn.begin(); 
      jObj = new JSONObject(content); 
      MyBeany bean = em.find(123); 

      bean.setVersion(Integer.parseInt(12345)); 
      em.remove(bean); 


      //here commit!!!!! 
      em.getTransaction().commit(); 
     } 
     catch(OptimisticLockException e) { //this is not caught here :(
      System.out.pritnln("here"); 
      //EntityTransactionManager.rollback(txn); 
      return HttpStatusHandler.sendConflict(); 
     } 
     catch(RollbackException e) { 
      return HttpStatusHandler.sendConflict(); 
     } 
     catch(Exception e) { 
      return HttpStatusHandler.sendServerError(e); 
     } 
     finally { 
      if(em != null) { 
       em.close(); 
      } 
     } 

エラーメッセージ:

[TopLink Warning]: 2011.01.28 05:11:24.007--UnitOfWork(22566987) 
--Exception [TOPLINK-5006] 
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException 

    [TopLink Warning]: 2011.02.01 08:50:15.095--UnitOfWork(681660)-- 
javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink 
Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException 

答えて

3

100%わからないが、それはあなたがjavax.persistence.OptimisticLockException(パッケージに気づく)をキャッチしているが、スローされた例外がoracle.toplink.essentials.exceptions.OptimisticLockExceptionあるとして、それは捕まるいないことが考えられます?例外クラスの名前は同じですが、同じクラスではありません。

+0

良い点。私は上記のコードで、javax.persistence.OptimisticLockExceptionをキャッチしていました。私はcatch節を変更してoracle.toplink.essentials.exceptions.OptimisticLockExceptionをキャッチしましたが、キャッチしない限りです。私は自分の投稿にエラーmsgを追加しました。両方のタイプのパッケージを示しています..非常に混乱しています –

+0

私の推測ではRalphが指摘したように、em.getTransaction()内に例外がスローされていますので、optimisticLockExceptionを手動でキャッチできません。唯一の方法は、ロールバック例外をキャッチし、 "競合"が発生したと仮定することです。 :( –

+0

"catch(Exception e)"は、try-block内でスローされた例外(未チェックまたはチェック)を捕捉する必要があります。 – esaj

2

私はそれがem.getTransaction().commit();文でスローされますよね。

java doc of RollbackExceptio N場合は言っているので:EntityTransaction.commit()が失敗した場合

永続プロバイダによってスロー。

は、私は強く、これはあなたが本当にラインbean.setVersion(Integer.parseInt(12345);)で(それが原因で不足しているのコンパイルされないでしょう)を使用したコードではないことを信じて、しかし実際のコードは、同じ問題を抱えていることを私は「希望」。

+0

私はそのタイプミスを修正しましたが、問題はまだどちらも楽観的なロックパッケージがキャッチされていないことです。 –

0

entityManager.flush()を呼び出してみましたか。あなたのtry/catchブロックの中に? JPAがフラッシュするときは、OptimisticLock例外がスローされます。

また、トランザクションを自分のやり方でコミットする必要はありません。あなたは単純にtxn.commit()を実行できました。 em.getTransaction()。commit();の代わりに。

私は、javax.persistence.OptimisticLockExceptionを捕まえることができる同様の状況があります。私の場合は、ReSTエンドポイントをSSBにして、エンティティマネージャを挿入しました。次に私は別のSSBのメソッドを呼び出し、このSSBも注入され、このbizロジックのコントローラとして機能します。このコントローラはflush()を実行し、RestX/SSBがキャッチして再試行するOLEXとrethrowsとApplicationExceptionをキャッチします。このパターンを使用する場合は、TransactionAttributeType.RequiresNewを必ず指定して、古いトランザクションを無効にするので、新しいトランザクションで再試行を行うようにする必要があります。

関連する問題