import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
//要作为参数传递的实体类(要实现remote调用,必须序列化)
public class Person implements Serializable{
@Id
@GeneratedValue
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
//接口
public interface PersonService {
public void add(Person p);
}
//实现类
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@Remote
@Local
//加入拦截器的定义,如果定义了多个拦截器,会按照定义的顺序先后执行,除了可以在外部定义拦截器之外,还可以将Session Bean中的一个或多个方法定义为拦截器,但是注意定义在外部的拦截器优先级高于定义在bean类中的优先级。
@Interceptors({SecurityInterceptor.class, OtherSomethingInterceptor.class})
public class PersonServiceImpl implements PersonService {
@PersistenceContext(unitName="test")
private EntityManager entityManager;
public void add(Person p) {
entityManager.persist(p);
System.out.println("User对象已经被存储 name:" + p.getName() +"其Id是" + p.getId());
}
//如下是我自己定义的拦截器
@AroundInvoke
public Object myBeanInterceptor(InvocationContext context) {
}
}
//第一个拦截器
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class SecurityInterceptor {
@AroundInvoke
public Object doit(InvocationContext context) throws Exception {
System.out.println("要执行的方法是--->" + context.getMethod().getName());
System.out.println("ContextDate--->" + context.getContextData());
System.out.println("Target--->" + context.getTarget());
System.out.println("Parameters--->");
Object parameters[] = context.getParameters();
for(int i=0; i<parameters.length; i++) {
System.out.println(parameters[i]);
System.out.println("\n");
}
context.getContextData().put("hello", "世界你好");
//继续向下执行,相当于Filter中的doFilter()
Object object = context.proceed();
System.out.println("====方法" + context.getMethod().getName() + "已经执行完成");
return object;
}
}
//第二个拦截器
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class OtherSomethingInterceptor {
@AroundInvoke
public Object doSomething(InvocationContext context) throws Exception {
System.out.println("第二个拦截器接收到的数据:" + context.getContextData());
Object object = context.proceed();
System.out.println("第二个拦截器的内容执行 完了");
return object;
}
}
//客户端的测试
import javax.naming.InitialContext;
import com.bjsxt.jpa.Person;
import com.bjsxt.jpa.PersonService;
public class Client {
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
PersonService ps = (PersonService)ctx.lookup("PersonServiceImpl/remote");
Person p = new Person();
p.setName("张三");
ps.add(p);
}
}
运行结果:
09:57:13,875 INFO [STDOUT] 要执行的方法是--->add
09:57:13,875 INFO [STDOUT] ContextDate--->{}
09:57:13,875 INFO [STDOUT] Target--->com.bjsxt.jpa.PersonServiceImpl@e9f6ef
09:57:13,875 INFO [STDOUT] Parameters--->
09:57:13,875 INFO [STDOUT] com.bjsxt.jpa.Person@1ffb7d4
09:57:13,875 INFO [STDOUT] 第二个拦截器接收到的数据:{hello=世界你好}
09:57:13,937 INFO [STDOUT] Hibernate: insert into Person (name) values (?)
09:57:13,937 INFO [STDOUT] User对象已经被存储 name:张三其Id是11
09:57:13,937 INFO [STDOUT] 第二个拦截器的内容执行 完了
09:57:13,937 INFO [STDOUT] ====方法add已经执行完成
注意:通过控制台的打印结果可以看出 Interceptor的执行流程与"责任链设计模式"中的执行流程式一样的。有了拦截器我们可以在要执行的方法前后加入自己的一些其他的业务逻辑。
关于拦截器的命名规范以及优先级,包括拦截器有父类等情况,请参照附件中文档
分享到:
相关推荐
NULL 博文链接:https://taoistwar.iteye.com/blog/663709
EJB拦截器的Demo
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
学习常用知识(java,sql,oracle,ejb,ssh,struts,xml,监听器,拦截器,过滤器等等)这些都是本人的学习心得非常适用,希望能该初学者带来更大的帮助!!!
struts2-ejb3配置,可以在EJB上面使用struts2 和JBOSS一起使用。
分布式对象; 远程方法调用; CORBA; RMI-IIOP; 企业JavaBeans RMI技术研究及其在EJB中的应用
j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee without ejb 中文 part2j2ee ...
实战EJB 实战EJB 实战EJB 电子书 pdf
在jbuilder中开发ejb讲解
EJB中ejb-jar——xml文件说明.pdf
EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.
EJB方面EJB方面EJB方面EJB方面EJB方面
不要在EJB的代码中写多线程的代码; 6)集群 7)负载均衡 5, EJB的类型 1) 会话Bean: 实现业务逻辑 有状态的会话Bean: 保存客户状态 无状态的会话Bean: 不会保存的信息的和状态,无状态的SessionBean是可以重用...
精通EJB [中文], EJB早期文档资料
通常项目中,客户端往往需要频繁的对服务器端数据进行操作。当采用实体EJB作为数据的抽象层时...因此有必要在客户端与实体EJB层间加入Session EJB层,在Sessino EJB中实现商业逻辑并封装对实体EJB的操作。
本教程适合具有Java 语言基础的EJB 初学者。有读者来邮件问需不需要先学EJB2.0,作者明确地告诉你不用 学了。随着EJB3 的发展,EJB2 将会逐步成为历史。
EJB集群资料EJB集群资料EJB集群资料EJB集群资料
EJB2和EJB3的架构异同?详细讲解 EJB编程模型的简化 JPA替代实体Bean 拦截器概念
EJB中JNDI的使用源码例子