Welcome 微信登录

首页 / 软件开发 / JAVA / eclipse + JBoss 5 + EJB3开发指南(15):拦截器方法和拦截器类

eclipse + JBoss 5 + EJB3开发指南(15):拦截器方法和拦截器类2011-09-18 blogjava 哈佛校训一、拦截器方法

EJB3可以通过拦截器对Bean方法进行拦截和覆盖。这有些象AOP中的around。通过AOP的around方法, 可以修改被拦截方法的返回值、参数值,甚至可以取消被拦截方法的执行。EJB3的拦截器可以用在无状态 Session Bean、有状态Session Bean和消息驱动Bean(MDB)的方法中。实现拦截器的最简单的方法是使 用拦截器方法。也就是说,只要在当前的Bean中使用@AroundInvoke对某个方法进行注释(关于拦截器的 类都在javax.interceptor包中),那么这个方法就会变成拦截器方法,该拦截器方法会拦截当前Bean中 的所有方法。实现过程如下:

@Statefulpublic class GreeterBean implements Greeter{    @AroundInvoke    public Object myInterceptorMethod1(InvocationContext ic) throws Exception    {        System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());        obj = ic.proceed();        }    @AroundInvoke    public Object myInterceptorMethod2(InvocationContext ic) throws Exception    {        System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());        obj = ic.proceed();        }    @Override    public String greet(String name)    {        return "hello " + name;    }}
上面的Stateful Session Bean中定义了两个拦截器方法和一个Bean方法。当客户端调用greet方法时 ,EJB容器会先调用myInterceptorMethod1方法,然后会调用myInterceptorMethod2方法,最后会调用 greet方法。使用拦截器方法时要注意如下几点:

1. 拦截器方法必须有一个返回值,返回值类型是Object。

2. 拦截器方法只能有一个参数,而且该参数类型必须是javax.interceptor.InvocationContext。

3. 只有调用InvocationContext接口的proceed方法,EJB容器才会调用下一个拦截器方法或被拦截 的Bean方法。

4. 由于proceed方法要求抛出一个Exception异常,因此,拦截器方法必须抛出一个Exception异常 ,或在拦截器方法中使用try...catch来捕捉proceed方法抛出的异常。