eclipse + JBoss 5 + EJB3开发指南(15):拦截器方法和拦截器类

简介: 本文为原创,如需转载,请注明作者和出处,谢谢!上一篇:eclipse + JBoss 5 + EJB3开发指南(14):消息驱动Bean一、拦截器方法     EJB3可以通过拦截器对Bean方法进行拦截和覆盖。
本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇: eclipse + JBoss 5 + EJB3开发指南(14):消息驱动Bean

一、拦截器方法

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

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

import  javax.interceptor.AroundInvoke;
import  javax.interceptor.InvocationContext;

public   class  MyInterceptor
{
    @AroundInvoke
    
public  Object interceptorMethod(InvocationContext ic)  throws  Exception
    {
        System.out.println(
" MyInterceptor: "   +  ic.getMethod().getName());
        
return  ic.proceed();
    }
}

    为了使用该拦截器类,需要在SessionBean或MDB中使用@Interceptors来指定要使用的拦截器类。代码如下:
@Stateful
@Interceptors(MyInterceptor.
class )
public   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;
    }
}

    如果有多个拦截器类,可以使用如下的代码来指定这些拦截器类:
   
@Interceptors({MyInterceptor. class , MyInterceptor1. class })

    如果指定了多个拦截器类和拦截器方法,就涉及到一个调用顺序的问题。EJB容器会先调用拦截器类中的拦截器方法、如果有多个拦截器类被指定,按指定的顺序进行调用。也就是说,MyInterceptor类中的拦截器方法会最先被调用,然后是MyInterceptor1类中的拦截器方法。最后会调用在Bean中定义的拦截器方法(myInterceptorMethod1和myInterceptorMethod2)。
    在默认情况下,拦截器类将拦截所有的Bean方法,但可以使用@ExcludeClassInterceptors注释来阻止拦截器对某个Bean方法进行拦截。如在GreeterBean类中还有一个getValue方法,那么阻止该方法被拦截的代码如下:

@ExcludeClassInterceptors
public  String getValue()
{
    
return   " abcd " ;
}

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



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
C语言 Android开发 Windows
解决windows下eclipse创建project时没有include导致出现“unresolved inclusion: <stdio.h>”错误的方法
解决windows下eclipse创建project时没有include导致出现“unresolved inclusion: <stdio.h>”错误的方法
解决windows下eclipse创建project时没有include导致出现“unresolved inclusion: <stdio.h>”错误的方法
|
Java 应用服务中间件 Android开发
【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)
  之前一直用的EJB开发环境是他们搭建好的,直接拿来用,不过还是感觉老吃别人嚼好的不太好吃,所以自己动手来玩一玩。   EJB开发依赖的最基本的环境:JDK、Eclipse、JBoss,这里简单介绍一下最基本的环境的搭建。
【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)
|
8月前
|
Java Android开发
eclipse去掉try-catch,构造方法,get,set方法等里面自动生成的注释
eclipse去掉try-catch,构造方法,get,set方法等里面自动生成的注释
66 0
|
IDE Java 程序员
Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
700 0
Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
|
测试技术 Android开发
消失的Eclipse-控制台console、右侧项目导航Package Explorer、点击类不弹出内容、copy过来正确的测试单元类'废了'的解决措施、eclipse设置编译前自动保存代码
消失的Eclipse-控制台console、右侧项目导航Package Explorer、点击类不弹出内容、copy过来正确的测试单元类'废了'的解决措施、eclipse设置编译前自动保存代码
185 0
消失的Eclipse-控制台console、右侧项目导航Package Explorer、点击类不弹出内容、copy过来正确的测试单元类'废了'的解决措施、eclipse设置编译前自动保存代码
|
Java 应用服务中间件 Android开发
eclipse jee配置jetty的两种方法【亲测可用】
eclipse jee配置jetty的两种方法【亲测可用】
1054 0
eclipse jee配置jetty的两种方法【亲测可用】
|
Android开发
错误: 程序包org.eclipse.swt.graphics不存在/swt.jar下载方法
错误: 程序包org.eclipse.swt.graphics不存在/swt.jar下载方法
79 0
|
XML Java Go
eclipse开发工具性能优化设置方法
eclipse开发工具性能优化设置方法
627 0
eclipse开发工具性能优化设置方法
|
Java Linux Android开发
【工具使用】eclipse来回切换项目的JDK版本的方法(最全的)
我们用eclipse在做项目的时候会切换jdk版本,本地运行的项目所使用的jdk版本比Linux服务器高(低),需要调低(高)JDK版本。那么如何通过eclipse配置来切换呢?
1227 0
【工具使用】eclipse来回切换项目的JDK版本的方法(最全的)
|
Android开发
eclipse文档注释设置、文件(Files)注释标签、类型(Types)注释标签(类的注释)、字段(Fields)注释标签、构造函数(Constructor)标签
设置注释模板的入口Window->Preference->Java->CodeStyle->CodeTemplate然后展开Comments节点就是所有需设置注释的元素。本文将每一个元素逐一给大家介绍一下。方法(Methods)标签、覆盖方法(Overriding Methods)标签、代理方法(Delegate Methods)标签、getter方法标签、setter方法标签.........
104 1
eclipse文档注释设置、文件(Files)注释标签、类型(Types)注释标签(类的注释)、字段(Fields)注释标签、构造函数(Constructor)标签

推荐镜像

更多