Java EE EJB拦截器教程和示例
在此示例中,我们将看到如何在EJB中使用拦截器并使用简单的Web应用程序对其进行测试。
1.简介
顾名思义,当您想拦截对EJB方法的调用时,将使用拦截器。 如果为Bean声明一个拦截器,则每次调用该Bean的方法时,该拦截器的一个方法都将拦截该方法。 这意味着执行直接进入了拦截器的方法。 然后,拦截方法可以决定是调用被拦截的EJB方法还是简单地替换它。
您可能会发现上述行为类似于面向方面的编程哲学,并且您是正确的。 尽管这两种技术的实现方式完全不同,但事实是它们可以用于相同的目的。 例如,当您想在执行Beans方法之前或之后记录某些内容时。 或者,当您要强制执行有关方法调用的特定策略时,例如,身份验证,输入检查等。当然,EJB可以具有一系列拦截器,这些拦截器将按特定顺序拦截该方法。
在这个示例中,我们将创建一个EAR项目和一个EJB项目,它们将托管我们的EJB和拦截器,以及一个动态Web应用程序,它将托管一个Servlet以测试上述行为。 我们将使用Eclipse Java EE IDE 4,3 Kepler和Glassfish 4.0作为容器。
2.创建一个新的企业应用程序项目
创建一个名为EJBInterceptorEAR
的新企业应用程序项目。在Eclipse IDE中,选择File-> EJBInterceptorEAR
> Enterprise Application Project并填写表单,然后单击Finish:
3.创建一个新的EJB Projet
创建一个名为InterceptorsEJB
的新EJB项目。 我们将基于此创建会话bean。 转到文件->新建-> EJB项目并填写表单。 注意选择“ Add EAR Project”,然后选择“ EJBInterceptorEAR
”作为EAR项目名称:
单击下一步两次,然后选择创建EJB客户端JAR以及生成ejb-jar.xml
部署描述符:
4.创建一个简单的拦截器类
我们将定义一个只有一种方法的简单拦截器。 在InterceptorsEJB
项目的ejbModule
文件夹下,创建一个名为com.javacodegeeks.enterprise.ejb.interceptor
的新包,并创建以下类:
SimpleInterceptor.java:
package com.javacodegeeks.enterprise.ejb.interceptor;import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;public class SimpleInterceptor {@AroundInvokepublic Object intercept(InvocationContext context) throws Exception {System.out.println("SimpleInterceptor - Logging BEFORE calling method :"+context.getMethod().getName() );Object result = context.proceed();System.out.println("SimpleInterceptor - Logging AFTER calling method :"+context.getMethod().getName() );return result;}
}
请注意,使用@AroundInvoke
注释的public Object intercept
。 这意味着该特定方法将在EJB方法调用上进行拦截。 重要的是要解决这样一个事实,即拦截器类可以具有任意数量的方法,但是@AroundInvoke
只能注释一个方法。
可以将intercept
方法的InvocationContext
参数用于两个目的。 您可以提取与被拦截的EJB方法有关的有用信息(例如,我们使用getMethod().getName()
API调用链来获取被拦截方法的名称),也可以使用proceed()
API继续执行方法。 如果链中没有拦截器,则此方法会将执行流切换到链中的下一个拦截器,或切换到实际的拦截的EJB方法。 该方法将返回EJB方法调用的结果。 但是我们不知道返回的类型,因此proceed()
返回一个Object
实例。 如果您确实知道EJB方法的返回类型,则可以将proceed()
的结果转换为该特定类型,然后根据需要使用该实例。 注意, intercept
方法还返回实际EJB调用的结果。 这将被传递到拦截器链中的下一个拦截器,或者如果没有其他拦截器则传递给客户端。
因此,在调用实际的EJB方法之前要执行的任何业务逻辑都应放在调用proceed()
之前。 因此,在调用proceed()
之后,将要执行的代码放入实际的EJB方法之后。 当然,如果需要,您可以一起绕过EJB方法的常规执行。
4.创建一个简单的EJB
这是将使用上述拦截器拦截其方法的EJB。 在InterceptorsEJB
项目的ejbModule
文件夹下,创建一个名为com.javacodegeeks.enterprise.ejb
的新包,并创建以下类:
package com.javacodegeeks.enterprise.ejb;import javax.ejb.Stateless;
import javax.interceptor.Interceptors;import com.javacodegeeks.enterprise.ejb.interceptor.SimpleInterceptor;@Stateless
@Interceptors(SimpleInterceptor.class)
public class SimpleEJB {public String printMessage(String message) {System.out.println(" Executing method : printMessage" + message);return "Message is "+message;}}
如您所见,我们已使用@Interceptors(SimpleInterceptor.class)
批注标记了该类。 这意味着该类的所有方法将被SimpleInterceptor
拦截
让我们创建一个简单的Servlet
来测试所需的功能。
5.创建一个新的动态Web项目
转到文件->新建->动态Web项目。 填写表单,确保您选中“将项目添加到EAR”,并把EJBInterceptorEAR
作为“ EAR项目名称”:
单击“完成”后,转到项目资源管理器,然后右键单击“ Project InterceptorTesting
然后转到“属性”->“部署程序集”->“添加”->“项目”->“ EJBInterceptorEAR
:
6.创建新的Servlet
转到 InterceptorTesting
Web项目并创建一个名为 TestSerlvet
的新Servlet :
让我们看一下该Servlet的代码:
TestServlet.java:
package com.javacodegeeks.enterprise.servlet;import java.io.IOException;import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.javacodegeeks.enterprise.ejb.SimpleEJB;@WebServlet("/TestSerlvet")
public class TestSerlvet extends HttpServlet {private static final long serialVersionUID = 1L;public TestSerlvet() {super();}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("Hello from Servlet");InitialContext ic;SimpleEJB bean;String message = request.getParameter("printMessage");if (message != null) {try {ic = new InitialContext();bean = (SimpleEJB) ic.lookup("java:global/EJBInterceptorEAR/InterceptorTesting/SimpleEJB!"+ "com.javacodegeeks.enterprise.ejb.SimpleEJB");bean.printMessage(message);} catch (NamingException e) {e.printStackTrace();}}}
}
正如你可以看到我们简单的解析printMessage
查询参数和我们的价值传递给printMessage
的方法SimpleEJB
。
提示: 如果您在找出EJB PassivationObject的可移植JNDI名称时遇到麻烦,请在部署项目时查看Glassfish的日志或输出,您会发现这样的一行:2014-01-09T15:14:14.627 + 0200 | INFO :EJB5181:EJB SimpleEJB的便携式JNDI名称:java:global / EJBInterceptorEAR / InterceptorTesting / SimpleEJB!
com.javacodegeeks.enterprise.ejb.SimpleEJB,java:global / EJBInterceptorEAR / InterceptorTesting / SimpleEJB)
7.测试
您可以在Glassfish上部署您的应用程序并发出以下请求:
http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG
如果您在控制台上观看Glassfish的输出,则会看到:
2014-01-09T17:43:14.356+0200|INFO: Hello from Servlet
2014-01-09T17:43:14.357+0200|INFO: Logging BEFORE calling method :printMessage
2014-01-09T17:43:14.357+0200|INFO: Executing method : printMessage : Hello From JCG
2014-01-09T17:43:14.357+0200|INFO: Logging AFTER calling method :printMessage
8.多个拦截器
继续,在com.javacodegeeks.enterprise.ejb.interceptor
包下的InterceptorsEJB
项目中创建另一个新的Interceptor。
这里是 :
SecondInterceptor.java:
package com.javacodegeeks.enterprise.ejb.interceptor;import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;public class SecondInterceptor {@AroundInvokepublic Object intercept(InvocationContext context) throws Exception {System.out.println("SecondInterceptor - Logging BEFORE calling method :"+context.getMethod().getName() );Object result = context.proceed();System.out.println("SecondInterceptor -Logging AFTER calling method :"+context.getMethod().getName() );return result;}
}
这是SimpleEJB
。
SimpleEJB.java:
package com.javacodegeeks.enterprise.ejb;import javax.ejb.Stateless;
import javax.interceptor.Interceptors;import com.javacodegeeks.enterprise.ejb.interceptor.SecondInterceptor;
import com.javacodegeeks.enterprise.ejb.interceptor.SimpleInterceptor;@Stateless
@Interceptors({SimpleInterceptor.class, SecondInterceptor.class})
public class SimpleEJB {public String printMessage(String message) {System.out.println(" Executing method : printMessage" + message);return "Message is "+message;}}
现在,如果我们再次发出相同的请求:
http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG
如果您在控制台上观看Glassfish的输出,则会看到:
2014-01-09T17:59:55.647+0200|INFO: Hello from Servlet
2014-01-09T17:59:55.659+0200|INFO: SimpleInterceptor - Logging BEFORE calling method :printMessage
2014-01-09T17:59:55.659+0200|INFO: SecondInterceptor - Logging BEFORE calling method :printMessage
2014-01-09T17:59:55.660+0200|INFO: Executing method : printMessageHello From JCG
2014-01-09T17:59:55.660+0200|INFO: SecondInterceptor -Logging AFTER calling method :printMessage
2014-01-09T17:59:55.660+0200|INFO: SimpleInterceptor -Logging AFTER calling method :printMessage
9.方法层拦截器
有时,您可能不希望所有的bean方法都被拦截。 您可以通过注释来选择要拦截的方法,而不是整个类。
让我们看看如何:
SimpleEJB.java:
package com.javacodegeeks.enterprise.ejb;import javax.ejb.Stateless;
import javax.interceptor.Interceptors;import com.javacodegeeks.enterprise.ejb.interceptor.SimpleInterceptor;@Stateless
public class SimpleEJB {@Interceptors(SimpleInterceptor.class)public String printMessage(String message) {System.out.println(" Executing method : printMessage : " + message);return "Message is " + message;}public String printSomething(String message) {System.out.println(" Executing method : printSomething :" + message);return "Message is " + message;}}
TestServlet.java:
package com.javacodegeeks.enterprise.servlet;import java.io.IOException;import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.javacodegeeks.enterprise.ejb.SimpleEJB;@WebServlet("/TestSerlvet")
public class TestSerlvet extends HttpServlet {private static final long serialVersionUID = 1L;public TestSerlvet() {super();}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("Hello from Servlet");InitialContext ic;SimpleEJB bean;String message = request.getParameter("printMessage");if (message != null) {try {ic = new InitialContext();bean = (SimpleEJB) ic.lookup("java:global/EJBInterceptorEAR/InterceptorTesting/SimpleEJB!"+ "com.javacodegeeks.enterprise.ejb.SimpleEJB");bean.printMessage(message);bean.printSomething("This method is not intercepted");} catch (NamingException e) {e.printStackTrace();}}}}
现在,如果我们再次发出相同的请求:
http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG
如果您在控制台上观看Glassfish的输出,则会看到:
2014-01-09T19:52:00.909+0200|INFO: Hello from Servlet
2014-01-09T19:52:00.920+0200|INFO: SimpleInterceptor - Logging BEFORE calling method :printMessage
2014-01-09T19:52:00.921+0200|INFO: Executing method : printMessage : Hello From JCG
2014-01-09T19:52:00.921+0200|INFO: SimpleInterceptor -Logging AFTER calling method :printMessage
2014-01-09T19:52:00.921+0200|INFO: Executing method : printSomething :This method is not intercepted
下载Eclipse项目
这是EJB拦截器上的一个示例。 下载本教程的Eclipse项目: EJBInterceptor.zip
翻译自: https://www.javacodegeeks.com/2013/07/java-ee-ejb-interceptors-tutorial-and-example.html
Java EE EJB拦截器教程和示例相关推荐
- ejb 示例 2018_Java EE EJB拦截器教程和示例
ejb 示例 2018 在此示例中,我们将看到如何在EJB中使用拦截器并使用简单的Web应用程序对其进行测试. 1.简介 顾名思义,当您想拦截对EJB方法的调用时,将使用拦截器. 如果为Bean声明一 ...
- Java EE 企业级应用开发教程 第2版
Java EE 企业级应用开发教程 第2版 Spring 介绍 概述 分层的 Java 一站式轻量级开源框架 控制反转 (IoC) 面向切面编程(AOP) 优点 非侵入式设计 降低耦合性,方便开发 支 ...
- Java EE CDI依赖关系消歧示例
在本教程中,我们将向您展示如何避免CDI bean中的依赖关系消除歧义. 在CDI中,我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入. 依赖关系消除歧义的问题是客户端如何在不同的实现中调 ...
- JAVA过滤器以及拦截器的基本介绍以及使用
JAVA过滤器以及拦截器的使用介绍 一 过滤器 1.1 过滤器简单介绍 JAVA过滤器能够对目标资源的请求和响应进行截取,对目标资源的请求和响应进行预处理,然后交给下一个过滤器或servlet处理. ...
- Java EE企业级应用开发教程教材源码课后题答案
Java EE企业级应用开发教程 教材源码+课后题答案 百度网盘链接: https://pan.baidu.com/s/1icNDocxxx9GD-UHUtQQU0A 提取码:L6X6
- Java EE CDI Producer方法教程
这是CDI Producer方法的教程. 在CDI中,生产者方法生成一个可以注入的对象. 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造 ...
- java web 过滤器 拦截器 监听器_Java中的拦截器和过滤器,可不是同一个东西
过滤器(Filter) 过滤器就如上面的水质过滤器一样,把管道中的水进行一遍过滤再使用.过滤器基于filter接口中的doFilter回调函数,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻 ...
- Java web登录拦截器_Spring MVC 拦截器实现登录
上篇博文我在博客中讲到如何使用spring MVC框架来实现文件的上传和下载,今天小钱给大家再来分享和介绍Spring MVC框架中相当重要的一块功能--拦截器. 关于拦截器的概念我在这里就不多说了, ...
- java创建请求拦截器,HttpClient拦截器
本篇文章帮大家学习HttpClient拦截器,包含了HttpClient拦截器使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 拦截器(interceptor)是那些有助于 ...
最新文章
- Tensorrt一些优化技术介绍
- [PA2014]Pakowanie
- 推荐个所见即所得的编辑器
- 训练数据集时为何要先加载预训练模型作为初始化,这样做有何好处?
- java mousepress_Java线程原语弃用
- win7连接sftp_SFTP远程连接服务器上传下载文件-vs2013项目实例
- php试题与答案(二),php面试题附答案二
- Kinect SDK v1.7 新特性、交互框架与新概念
- 金山云上市首日暴涨 40%,雷军:「All in」才有机会胜出
- python线程监控_Python监控php-fpm进程
- 2天玩转单反相机引领时尚娱乐新生活
- 图像识别pytorch入门1
- 推荐6款好用、免费的远程控制软件【远程管理工具】
- echarts地图随机点生成
- Ragel State Machine Compiler 的速度测试
- 美的集团计算机综合面试群面,美的集团面试
- apicloud总结
- java rmi 推送_java 企业微信推送消息 示例源码
- Android刘海屏、水滴屏全面屏适配详解,android开发实战湖南师范大学出版社
- 魔力宝贝登录一直服务器无响应,魔力宝贝归来怎么提升战力?
热门文章
- 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用
- 写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项
- java heroku_使用Spring Boot和Heroku在20分钟内完成Java的单点登录
- 清除java_如何在Java地毯下有效地清除问题
- javaone_JavaOne 2016后续活动
- 乡村野生草药_官方野生蝇群流口水分数
- java永生代和新生代_Java:永生的对象和对象的复活
- jolokia_使用WildFly 9和Jolokia监视DevOps样式
- 红帽 jboss_红帽峰会2015所需的JBoss BPM内容指南
- HelloWorld.java –打印Hello World的Java程序