论坛首页 Java企业应用论坛

在Ejb中加入拦截器

浏览 2212 次
精华帖 (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的执行流程与"责任链设计模式"中的执行流程式一样的。有了拦截器我们可以在要执行的方法前后加入自己的一些其他的业务逻辑。
   发表时间:2010-12-17  
嗯,昨晚我耶实现了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics