浏览 2212 次
锁定老帖子 主题:在Ejb中加入拦截器
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-06
最后修改:2010-03-06
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 //加入拦截器的定义 @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()); } } //第一个拦截器 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的执行流程与"责任链设计模式"中的执行流程式一样的。有了拦截器我们可以在要执行的方法前后加入自己的一些其他的业务逻辑。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-17
嗯,昨晚我耶实现了
|
|
返回顶楼 | |