4

OptimisticLockException (JPA Exception) をスローするコードがいくつかあります。

try{
    account.someFunction();
}catch(OptimisticLockException ole){
    logger.log(Level.DEBUG, "OptimisticLockException with ole !");      
}catch(Exception e){
    logger.log(Level.DEBUG, "OptimisticLockException with e !");
}

そして、私はいつも受け取りましOptimisticLockException with e !た。私のサーバーログの表示:

Exception [EclipseLink-5006] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.OptimisticLockException
...

OptimisticLockExceptionのcatchブロックはorg.eclipse.persistence.exceptions.OptimisticLockExceptionサーバーログのようなタイプですが、このcatchブロックに陥ることはありません...

どうして...?

アイデアをありがとう。

PS: Maven と Glassfish を使用しています。最初は、アーティファクト eclipselink v2.4.1 を使用していましたが、サーバー側は 2.3.2 (ログを参照) でしたので、Maven のバージョンを 2.3.2 に変更しましたが、結果は同じでした。

4

2 に答える 2

1

どうやら、OptimisticLockException (javax.persistence または org.eclipse.persistence.exceptions パッケージのいずれか) は他の例外内にラップされているため、直接キャッチすることはできません。

私はこのコードをテストしました:

try{
        account.someFunction();
    }catch(OptimisticLockException o1){
        logger.log(Level.DEBUG, "org.eclipse.persistence.exceptions.OptimisticLockException thrown !");         
    }catch(javax.persistence.OptimisticLockException o2){
        logger.log(Level.DEBUG, "javax.persistence.OptimisticLockException thorwn !");          
    }catch(Exception e){            

        int i=1;

        for(Throwable t=(Throwable)e; t!=null; t=t.getCause()){
            if(t instanceof OptimisticLockException)
                logger.log(Level.DEBUG, "org.eclipse.persistence.exceptions.OptimisticLockException thrown by Exception block ! " + i);
            else if(t instanceof javax.persistence.OptimisticLockException)
                logger.log(Level.DEBUG, "javax.persistence.OptimisticLockException thrown by Exception block ! " + i);
            else
                logger.log(Level.DEBUG, t + " " + i);
            i++;
        }

    }

私は得る:

2012-11-26 14:58:03,515 FATAL [com.sim.web.LoginBean] javax.ejb.EJBException: トランザクションが中止されました 1

2012-11-26 14:58:03,515 FATAL [com.sim.web.LoginBean] javax.transaction.RollbackException: ロールバックのマークが付けられたトランザクション。2

2012-11-26 14:58:03,515 FATAL [com.sim.web.LoginBean] javax.persistence.OptimisticLockException が例外ブロックによってスローされました! 3

2012-11-26 14:58:03,515 FATAL [com.sim.web.LoginBean] org.eclipse.persistence.exceptions.OptimisticLockException が例外ブロックによってスローされました! 4

そのため、最初にorg.eclipse.persistence.exceptions.OptimisticLockExceptionラップされjavax.persistence.OptimisticLockExceptionているjavax.transaction.RollbackExceptionものがありますjavax.ejb.EJBException(私はEJBとJTAを扱っています)。

RollbackExceptionEclipseはそのような例外がスローされる可能性があることを検出しないため、catchブロック例外でテストできません: Unreachable catch block for RollbackException. This exception is never thrown from the try statement body.

Exception醜いですが、タイプの例外をキャッチし、タイプの例外が含まれているかどうかを再帰的にテストすることを非難されていると思いますOptimisticLockException...

前回のアドバイスありがとう

于 2012-11-26T14:12:26.443 に答える
0

コードを次のように変更してみてください。

try {
    account.someFunction();
}
catch(javax.persistence.OptimisticLockException ole) {
    logger.log(Level.DEBUG, "OptimisticLockException with ole !");      
}
catch(Exception e) {
    logger.log(Level.DEBUG, "OptimisticLockException with e !");
}

そして、それが機能するかどうかを確認してください。Eclipse の実装ではなく、JPA OptimisticLockException をキャッチする必要があると思います。

また、ロギング構成を再確認し、しきい値が正しいことなどを確認し、DEBUG レベルで他のログ ステートメントを取得できるかどうかを確認します (おそらく、ログ ステートメントをaccount.someFunction();.

于 2012-11-25T00:36:58.713 に答える