- EJB 教程
- EJB - 首页
- EJB - 概述
- EJB - 环境设置
- EJB - 创建应用程序
- EJB - 无状态Bean
- EJB - 有状态Bean
- EJB - 持久性
- EJB - 消息驱动Bean
- EJB - 注解
- EJB - 回调
- EJB - 定时器服务
- EJB - 依赖注入
- EJB - 拦截器
- EJB - 可嵌入对象
- EJB - Blob/Clob
- EJB - 事务
- EJB - 安全性
- EJB - JNDI绑定
- EJB - 实体关系
- EJB - 访问数据库
- EJB - 查询语言
- EJB - 异常处理
- EJB - Web服务
- EJB - 打包应用程序
- EJB 有用资源
- EJB - 快速指南
- EJB - 有用资源
- EJB - 讨论
EJB - 异常处理
EJB是企业应用程序的一部分,这些应用程序通常基于分布式环境。因此,除了可能发生的普通异常之外,还可能出现诸如通信故障、安全权限、服务器宕机等异常。
EJB容器以两种方式考虑异常:
应用程序异常 - 如果违反业务规则或在执行业务逻辑时发生异常。
系统异常 - 任何不是由业务逻辑或业务代码引起的异常。RuntimeException、RemoteException属于系统异常。例如,EJB查找期间出错。RuntimeException、RemoteException属于系统异常。
EJB容器如何处理异常?
当发生应用程序异常时,EJB容器会拦截异常,但将其原样返回给客户端。除非在代码中通过EJBContext.setRollBackOnly()方法指定,否则它不会回滚事务。EJB容器不会在应用程序异常的情况下包装异常。
当发生系统异常时,EJB容器会拦截异常,回滚事务并启动清理任务。它将异常包装到RemoteException中并将其抛给客户端。
处理应用程序异常
应用程序异常通常在会话EJB方法中抛出,因为这些方法负责执行业务逻辑。应用程序异常应在业务方法的throws子句中声明,并在业务逻辑失败时抛出。
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
...
public List<Book> getBooks() throws NoBookAvailableException {
List<Book> 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<Book> getBooks() {
try {
List<Book> 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<Book> booksList = libraryBean.getBooks();
} catch(EJBException e) {
Exception ne = (Exception) e.getCause();
if(ne.getClass().getName().equals("SqlException")) {
System.out.println("Database error: "+ e.getMessage());
}
}
...
}
}
广告