5

私はaccountJSFBeanでEJBメソッドを次のように呼び出します。

try{
   account.someFunction(...);
}catch(SimRuntimeException e){
   logger.log(Level.FATAL, "SimRuntimeException catched !");
}catch(SimNotRuntimeException e){
   logger.log(Level.FATAL, "SimNotRuntimeException catched !");
}catch(Exception e){
   logger.log(Level.FATAL, "Exception catched !");
}

私の例外:

public class SimRuntimeException extends RuntimeException {

   public SimRuntimeException() {
      super();
   }

}



@ApplicationException(rollback=true)
public class SimNotRuntimeException extends Exception {

   public SimNotRuntimeException() {
      super();  
   }


}
  • account.someFunction(...);スローすると、おそらくEJBコンテナにラップされているため、ブロックSimRuntimeExceptionに陥ります。ExceptionSimRuntimeExceptionEJBException
  • account.someFunction(...);投げるときSimNotRuntimeException私は予想通りに落ちますSimNotRuntimeException

Exceptionでは、具体的にはwith@ApplicationException(rollback=true)RuntimeExceptionpleaseの違いは何ですか?

4

1 に答える 1

7

パルのブログには次のように書かれています。

EJB は、アプリケーション例外とシステム例外に違いをもたらします。アプリケーション例外は、ユーザーが定義し、スローし、認識しているものです。デフォルトでは、そのように定義しない限り、アプリケーション例外はロールバックを引き起こしません (推奨されると思います)。メソッドの署名で言及されているすべてのチェック済み例外、および @ApplicationException で注釈が付けられているすべてのチェック済みまたは未チェックの例外は、アプリケーション例外です。

システム例外は、制御できない場合に発生し、未チェックの例外です。それらは常にロールバックを引き起こします。良い方法は、チェック済みの例外 (避けられない) をメソッド内で EJBException (ParseException など) にラップする場合です。

于 2015-10-20T19:45:53.100 に答える