EJB容器中的@ApplicationException(rollback = true)与RuntimeException和Exception之间的区别

时间:2013-01-10 17:18:15

标签: java ejb runtimeexception

我在JSF bean中调用account 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(...);抛出SimRuntimeException时,我摔倒了 进入Exception阻止,因为我的SimRuntimeException已被包裹 可能由EJB容器进入EJBException
  • account.someFunction(...);抛出SimNotRuntimeException时,我按预期落下 进入SimNotRuntimeException

那么,Exception@ApplicationException(rollback=true)RuntimeException之间的具体区别是什么?

1 个答案:

答案 0 :(得分:7)

Pal's blog州:

  

EJB在Application Exceptions和System Exceptions中有所不同。应用程序异常是您定义的,您抛出的,您知道的。默认情况下,应用程序异常不会导致回滚,除非您以这种方式定义(我认为这是推荐的)。方法签名中提到的每个已检查异常以及使用@ApplicationException注释的任何已检查或未经检查的异常都是应用程序异常。

     

系统异常发生在您无法控制的情况下,并且它们是未经检查的异常。它们总是导致回滚。好的做法是,如果你将检查过的异常 - 无法避免 - 包装在你的EJBException方法中,例如ParseException的。