我在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
之间的具体区别是什么?
答案 0 :(得分:7)
EJB在Application Exceptions和System Exceptions中有所不同。应用程序异常是您定义的,您抛出的,您知道的。默认情况下,应用程序异常不会导致回滚,除非您以这种方式定义(我认为这是推荐的)。方法签名中提到的每个已检查异常以及使用@ApplicationException注释的任何已检查或未经检查的异常都是应用程序异常。
系统异常发生在您无法控制的情况下,并且它们是未经检查的异常。它们总是导致回滚。好的做法是,如果你将检查过的异常 - 无法避免 - 包装在你的EJBException方法中,例如ParseException的。