拦截器的异常处理简单而有力.因为拦截器在组件方法的Java调用栈或回调被调用,你可以放置一个try/catch/finally块在InvocationContext.proceed( )方法的周围.你可以中断调用在它到达实际组件方法之前通过抛出一个异常在@AroundInvoke 或回调方法.你也可以允许捕获一个组件方法抛出异常和抛出一个不同的异常,或禁止异常.关于@AroundInvoke 拦截器,你甚至被允许重试组件方法调用在从组件方法捕获一个异常后.让我们看一些例子.
终止一个方法调用
参数确认是检查见到的业务方法的参数在以方法的逻辑着手进行有效值确认的业务逻辑.ProcessPayment EJB的byCheck()方法,使用确认来确定是否CheckDO参数有一个最小的检查值.也许我们卖我们的泰坦巡航系统软件作为一个ERP系统到不同的巡航公司到世办各地.我们可能想要关闭检查确认为我们的ProcessPayment EJB的一个部署.为其它的部署,我们增加更复杂的验证,如,检查一个和数库中的名字和支票帐号不符的帐户.拦截器给我们装载验证逻辑的能力,在拦截器类中与配置应用它作为需要到ProcessPayment EJB的不同部署中.
因为拦截器类允许你终止EJB方法的调用在拦截器类自身中,在实际到达的组件方法之前,这种方式使得模块化验证成为可能:
package com.titan.interceptors;
import javax.ejb.*;
import javax.annotation.*;
import javax.interceptor.*;
public class CheckValidation
{
@Resource int minimumCheckNumber;
@AroundInvoke
public Object validateCheck(InvocationContext ctx) throws Exception {
CheckDO
check = ctx.getParameters( )[1];
if (check.checkNumber < minimumCheckNumber) {
throw new PaymentException
("Check number is too low");
}
return ctx.proceed( );
}
}
CheckValidation类中包装了ProcessPaymentBean.byCheck( )方法中的验证逻辑.它使用InvocationContext.getParameters( )方法来获取CheckDO参数.最小的检查从一个<env-entry>中的注入到拦截器类的minimumCheckNumber变量.validateCheck( )方法验证检查CheckDO中的数值大于最小的检查数值.如果验证失败它会终止调用同时抛出PaymentException.
验证仅仅是一个你想要终止EJB调用使用@AroundInvoke的方法.另一个例子是你实现自定义安全框架的情况下.EJB安全是很漂亮的基础,而且有时你有很大的安全需要.举例来说,你可能想要集成规则引挚到你的EJB中分析使用者作为方法和参数来确定是否允许使用者调用方法.这也可以使用一个拦截器来做.
捕获和重新抛出异常
除了终止一个给定的方法调用,你也可以捕获组件中使用被拦截器@AroundInvoke 方法抛出的异常.例如,你可以使用拦截器类作为一个抽像机制来创建异常处理框架.考虑到JDBC和java.sql.SQLException.当一个SQLException在你的程序代码中被抛出,不知道异常发生的原因,没有查看错误数或异常消息.不幸的是,不同的数据库提供商的错误代码和消息有所不同,因此,如果你想要处理确定情况的异常在确定的方法中,你的代码可以轻便的在不同数据库厂商之间.
让我们看两种常见的SQLException发生情况:死锁和游标无效.首先,我们将创建具体的异常继承SQLException:
@ApplicationException(rollback=true)
public class DatabaseDeadlockException extends java.sql.SQLException {
public DatabaseDeadlockException(Exception cause) {
Super(cause);
}
}
@ApplicationException(rollback=true)
public class DatabaseCursorNotAvailable extends java.sql.SQLException {
public DatabaseCursorNotAvailable(Exception cause) {
super(cause);
}
}
由于这些异常,我们依赖这些错误数来确定实际发生的数据库错误.客户端代码使用这些异常轻便的方式并且不用关心底层数据库提供商.但是在我们使用这些异常前,我们需要写拦截器类的异常处理:
public class MySQLExceptionHandler {
@AroundInvoke
public Object handleException(InvocationContext ctx) Exception {
try {
return ctx.proceed( );
} catch (SQLException sql) {
int ernum = sql.getErrorCode( );
switch(ernum) {
case 32343:
throw new DatabaseDeadlockException(sql);
case 22211:
throw new DatabaseCursorNotAvailable(sql);
...
default:
throw new RollbackAlwaysOnException(sql);
}
}
}
@AroundInvoke方简单捕获任何SQLException被组件方法抛出的,并且转换它到一个适当的客户端代码可以捕获的异常类型.当然,有一个异常处理拦截器类对于每个数据库提供商.这里的代码是你的应用程序如果利用拦截器的行为:
// application client code
{
try {
ejbref.invokeSomeDatabaseOperation( );
} catch (DatabaseDeadlockException deadlock) {
// handle this specific error case in a special way
}
}
所以,组合异常处理拦截器同EJB调用允许你有指定的代码来处理指定数据库的错误像死锁,不需要任何担心你的代码在厂商之间.
分享到:
- 2009-04-26 17:13
- 浏览 1353
- 评论(0)
- 论坛回复 / 浏览 (0 / 2511)
- 查看更多
相关推荐
理解EJB拦截器的工作原理,可以通过查看EJB容器(如TomEE、GlassFish、WildFly)的源码,了解它们如何解析注解和XML配置,以及如何调用拦截器。同时,利用IDE如IntelliJ IDEA或Eclipse的调试功能,可以帮助我们更好...
在EJB拦截器中,我们可以定义多个拦截器方法,这些方法会在EJB的生命周期事件(如方法调用、创建、销毁等)触发时按顺序执行。拦截器方法通过`@AroundInvoke`、`@PostConstruct`、`@PreDestroy`等注解标识,这些注解...
拦截器在EJB3中扮演的角色类似于AOP(面向切面编程)中的切面,通过在方法调用前、后或者异常处理时插入自定义逻辑。在EJB3中,我们可以声明拦截器并通过注解来指定它们的执行顺序和作用范围。例如,`@Interceptors`...
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
在IT领域,掌握Java、SQL、Oracle、EJB、SSH、Struts、XML以及监听器、拦截器和过滤器等技术是至关重要的。这些技术涵盖了Web应用开发的多个层面,对于初学者而言,理解并熟练运用它们能为职业生涯打下坚实的基础。 ...
3. **模型与控制器分离**:Action类处理业务逻辑,ActionForm封装请求参数,两者协同工作实现模型与控制器的分离。 4. **表单验证**:Struts提供了一套表单验证机制,可以在服务器端对用户输入进行验证。 **集成...
- `@Interceptor` 注释符用于指定拦截器。 - `@PostConstruct` 和 `@PreDestroy` 注释符用于标记 Bean 的初始化和销毁方法。 ##### 3.7 Timeout - `@Timeout` 注释符用于处理有状态会话 Bean 的超时事件。 ##### ...
在实际开发中,拦截器可以用于更复杂的场景,比如统一的异常处理、性能统计、安全控制等。掌握拦截器的使用,有助于提升代码的可维护性和复用性,是JavaEE开发者必备的技能之一。深入研究和实践Day01_Interceptor...
2. Struts2的拦截器如何与EJB3的事务管理相结合,确保事务的一致性。 3. 如何在Struts2的配置文件中定义Action及其结果,以及如何映射EJB3的业务方法。 4. EJB3的实体Bean是如何通过JPA(Java Persistence API)或...
同时,Struts1的拦截器可以与EJB3的实体交互,以执行一些预处理或后处理任务。在配置文件(如struts-config.xml或web.xml)中,需要适当地声明和配置这些组件,以实现它们之间的依赖和交互。 综上所述,这个项目...
**4.6 拦截器 (INTERCEPTOR)**: - 用于在方法调用前后执行自定义代码。 - 使用 `@Interceptor` 和 `@AroundInvoke` 等注解定义。 **4.7 依赖注入 (DEPENDENCY INJECTION)**: - 使用 `@Inject` 注解自动注入 Bean...
6. **异常处理**:EJB 3.0的异常处理更加灵活,可以使用@DeclareRoles和@RolesAllowed注解进行权限控制,同时,通过抛出ApplicationException来定义应用级异常。 7. **拦截器(Interceptors)**:EJB 3.0引入拦截器...
- **EJB 3.0新特性**:具体介绍了EJB 3.0引入的新特性,如依赖注入、拦截器等。 - **WebLogic Server增值功能**:除了标准EJB 3.0特性外,WebLogic Server还提供了一些额外的功能,比如更好的性能优化和增强的安全性...
- **拦截器与依赖注入**:拦截器用于在方法调用前后执行特定操作,而依赖注入则简化了对象之间的依赖管理,这两个特性在现代企业应用开发中极为常见。 #### 知识点五:JMS与消息驱动Bean - **消息传递模型**:教程...
6. **错误处理和验证**:利用Struts2的拦截器进行输入验证,处理异常,提供友好的错误提示。 7. **测试和调试**:了解如何进行单元测试和集成测试,以及使用调试工具分析和修复问题。 这个项目将带你走过Java Web...
Struts2的核心功能包括:动作映射、结果渲染、异常处理和国际化支持。在`黎活明_struts2教程.ppt`中,你将学习到如何创建Action类,配置Struts.xml文件,以及如何利用Interceptor拦截器实现业务逻辑。 2. **Spring...
7. **给EJB增加功能**: 包括Bean调用、通用注解、依赖注入、拦截器等内容。 8. **实体Bean高级**: 探讨实体Bean更高级的应用场景。 9. **事务处理**: 讲解EJB中的事务处理机制。 10. **EJB中的安全**: 探讨如何在...