首先看一下EJB的定义:
import javax.ejb.Local;
@Local public interface MyBean{ public String hello(); }
定义了Local接口
import javax.ejb.Stateless; import org.jboss.seam.annotations.Name;
@Stateless @Name("myBean") public class MyBeanImpl implements MyBean{ public String hello(){ return "hello world"; } }
bean的实现
------------------------------ 拦截器被seam当作普通的javabean来对待,即使用了@Name,也不认为它是一个对象。 @In注入是不起作用的。
@Interceptor(stateless=true,type=InterceptorType.CLIENT,within={BijectionInterceptor.class}) public class MyInterceptor extends AbstractInterceptor{ @Aroundinvoke public Object aroundInvoke(InvocationContext ctx) throws Exception{ //ctx.getMethod().getName //被调用的方法名 //ctx.getTarget() //被调用的类 //getComponent() //被调用的组件对象 //ctx.proceed() //执行被调用的方法。
//访问Session之类的东西可以通过org.jboss.seam.contexts.Contexts来查找 (xxx) xx = (xxx)Contexts.getSessionContext.get("gaga");
//JNDI来访问EJB,EJB的JNDI名可以参照components.xml中 //<core:init... jndi-pattern="gaga/#{ejbName}/local"/> //也可能自己指定,用@JndiName("gagagagagagag") Properties prop = new Properties(); prop.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); prop.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); prop.setProperty("java.naming.provider.url","127.0.0.1:1099"); InitialContext init = new InitialContext(prop); MyBean bean = (MyBean)init.lookup("gaga/MyBeanImpl/local"); System.out.println(bean.hello);
//通过组件访问EJB MyBean bean2 = (MyBean)Component.getInstance("myBean"); System.out.println(bean2.hello);
//有错的时候,可以设置message,返回null。 FacesContext.getCurrentInstance().addMessage("",new FacesMessage("gaga")); return null; } }
------------------------------------- 拦截器定义完后,如何应用呢?
import java.lang.annotation.*;
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Interceptors(MyInterceptor.class) public @interface MyChecker{}
以上是定义了一个标识。
在需要拦截的类上:
@Name("wawa") @MyChecker public class wawa {}
--------------------------------------- 哦了。
|