Eclipse JBoss EJB3拦截器方法和拦截器类
创始人
2024-04-06 04:51:02
0

一、拦截器方法

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

  1. @Stateful 
  2. public class GreeterBean implements Greeter  
  3. {  
  4.     @AroundInvoke 
  5.     public Object myInterceptorMethod1(InvocationContext ic) throws Exception  
  6.     {  
  7.         System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());  
  8.         obj = ic.proceed();      
  9.     }  
  10.     @AroundInvoke 
  11.     public Object myInterceptorMethod2(InvocationContext ic) throws Exception  
  12.     {  
  13.         System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());  
  14.         obj = ic.proceed();      
  15.     }  
  16.     @Override 
  17.     public String greet(String name)  
  18.     {  
  19.         return "hello " + name;  
  20.     }  

上面的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方法抛出的异常。

二、拦截器类

有一些拦截器方法会拦截器不同Bean中的方法,在这种情况下,需要将拦截器方法放在一个单独的类中。这个类就叫拦截器类。下面是一个拦截器类的代码:

  1. package service;  
  2.  
  3. import javax.interceptor.AroundInvoke;  
  4. import javax.interceptor.InvocationContext;  
  5.  
  6. public class MyInterceptor  
  7. {  
  8.     @AroundInvoke 
  9.     public Object interceptorMethod(InvocationContext ic) throws Exception  
  10.     {  
  11.         System.out.println("MyInterceptor:" + ic.getMethod().getName());  
  12.         return ic.proceed();  
  13.     }  
  14. }  

为了使用该拦截器类,需要在SessionBean或MDB中使用@Interceptors来指定要使用的拦截器类。代码如下:

  1. @Stateful 
  2. @Interceptors(MyInterceptor.class)  
  3. public class GreeterBean implements Greeter  
  4. {  
  5.     @AroundInvoke 
  6.     public Object myInterceptorMethod1(InvocationContext ic) throws Exception  
  7.     {  
  8.         System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());  
  9.         obj = ic.proceed();      
  10.     }  
  11.     @AroundInvoke 
  12.     public Object myInterceptorMethod2(InvocationContext ic) throws Exception  
  13.     {  
  14.         System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());  
  15.         obj = ic.proceed();      
  16.     }  
  17.     @Override 
  18.     public String greet(String name)  
  19.     {  
  20.         return "hello " + name;  
  21.     }  

如果有多个拦截器类,可以使用如下的代码来指定这些拦截器类:

  1. @Interceptors({MyInterceptor.class, MyInterceptor1.class}) 

如果指定了多个拦截器类和拦截器方法,就涉及到一个调用顺序的问题。EJB容器会先调用拦截器类中的拦截器方法、如果有多个拦截器类被指定,按指定的顺序进行调用。也就是说,MyInterceptor类中的拦截器方法会最先被调用,然后是MyInterceptor1类中的拦截器方法。最后会调用在Bean中定义的拦截器方法(myInterceptorMethod1和myInterceptorMethod2)。

在默认情况下,拦截器类将拦截所有的Bean方法,但可以使用@ExcludeClassInterceptors注释来阻止拦截器对某个Bean方法进行拦截。如在GreeterBean类中还有一个getValue方法,那么阻止该方法被拦截的代码如下:

  1. @ExcludeClassInterceptors 
  2. public String getValue()  
  3. {  
  4.     return "abcd";  

使用@ExcludeClassInterceptors只能阻止拦截器类中的拦截器方法对Bean方法的拦截,而在Bean中定义的拦截器方法仍然会拦截Bean方法。

【编辑推荐】

  1. Eclipse+JBoss+EJB3通过继承实体Bean将单个表映射成多个表
  2. Eclipse+JBoss+EJB3消息驱动Bean
  3. Eclipse+JBoss+EJB3在Servlet中访问EntityManager对象
  4. Eclipse+JBoss+EJB3使用命名查询执行JPQL
  5. Eclipse+JBoss+EJB3实体Bean的连接策略


 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...