EJB是它们通常分布基于环境的企业应用程序的一部分。因此,除了可能出现在代码中,在EJB的情况下正常例外,可以有例外,像通信故障,安全权限,服务器关闭等EJB容器认为例外两种方式。
应用程序异常 -如果业务规则是voilated或在执行业务逻辑发生异常。
系统异常 -这不是由业务逻辑或业务代码造成的任何异常。RuntimeException的,是RemoteException的SystemException的。例如,错误在EJB查找。
EJB容器如何处理异常?
当应用程序异常发生时,EJB容器截获的异常,但返回相同的客户端,因为它是。它不会回滚事务,除非它是由EJBContext.setRollBackOnly()方法中指定的代码。EJB容器不中的情况下应用程序异常的包装异常。
当系统异常时,EJB容器拦截异常,回滚事务,并开始清理任务。它包装异常到的RemoteException和它抛出给客户端。
处理应用程序异常
应用程序异常一般扔在会话EJB方法,因为这些都是负责执行业务逻辑的方法。应用程序异常应宣布抛出的商业方法条款,并应出现故障时业务逻辑被抛出。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List getBooks() throws NoBookAvailableException {
List books =
entityManager.createQuery("From Books").getResultList();
if(books.size == 0)
throw NoBookAvailableException
("No Book available in library.");
return books;
}
...
}
处理系统异常
系统异常可发生在类似命名查找失败的任何时间,在获取数据时发生SQL错误。在这种情况下,这种异常应EJBException的下包,丢回给客户端。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List getBooks() {
try {
List books =
entityManager.createQuery("From Books").getResultList();
} catch (CreateException ce){
throw (EJBException) new EJBException(ce).initCause(ce);
} catch (SqlException se){
throw (EJBException) new EJBException(se).initCause(se);
}
return books;
}
...
}
在客户端,处理出现EJBException。
public class EJBTester {
private void testEntityEjb(){
...
try{
LibraryPersistentBeanRemote libraryBean =
LibraryPersistentBeanRemote)ctx.lookup("LibraryPersistentBean/remote");
List booksList = libraryBean.getBooks();
} catch(EJBException e) {
Exception ne = (Exception) e.getCause();
if(ne.getClass().getName().equals("SqlException")){
System.out.println("Database error: "+ e.getMessage());
}
}
...
}
}