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

Oli*_* J. 5 java ejb runtimeexception

account在JSF bean中调用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 !");
}
Run Code Online (Sandbox Code Playgroud)

我的例外情况:

public class SimRuntimeException extends RuntimeException {

   public SimRuntimeException() {
      super();
   }

}



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

   public SimNotRuntimeException() {
      super();  
   }


}
Run Code Online (Sandbox Code Playgroud)
  • account.someFunction(...);抛出SimRuntimeException我陷入Exception块,因为我SimRuntimeException被包裹成EJBException可能是由EJB容器.
  • account.someFunction(...);抛出SimNotRuntimeException我属于预期成SimNotRuntimeException

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

小智 7

Pal的博客指出:

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

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