`
Anatorian
  • 浏览: 61438 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

通过Annotation和Struts2的interceptor实现向Action中注入jndi资源

    博客分类:
  • jndi
阅读更多

为了实现向struts2的Action中注入ejb3,我写了一个Annotation用来定义要注入哪个ejb3,又写了一个struts2的interceptor用来实施注入。Annotation代码如下:

@Retention(value=RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD})
@Inherited
public @interface JndiLookup {
    String jndi();
    Class type();
}

Interceptor代码如下:

public class JndiLookupInterceptor implements Interceptor {
 
    private InitialContext contaxt;
 
    public void destroy() {
        ;
    }
 
    public void init() {
        try {
            contaxt = new InitialContext();
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
 
    public String intercept(ActionInvocation invocation) 
            throws Exception {
        Method[] methods = invocation.getAction()
      .getClass().getMethods();
        for(Method method : methods) {
            try{
                Class[] parameterTypes 
        = method.getParameterTypes();
                if(parameterTypes.length != 1) {
                    continue;
                }
 
                JndiLookup jndiLookup 
        = method.getAnnotation(JndiLookup.class);
                if(jndiLookup == null) {
                    continue;
                }
                if(jndiLookup.jndi() == null 
            || jndiLookup.jndi().length() == 0) {
                    continue;
                }
                if(jndiLookup.type() == null) {
                    continue;
                }
 
                Object object = this.contaxt.lookup(jndiLookup.jndi());
                method.invoke(invocation.getAction(),
        new Object[] {jndiLookup.type().cast(object)});
            } catch (Exception e) {
                e.printStackTrace();
                ;
            }
 
        }
 
        return invocation.invoke();
    }
 
}

需要被注入的Action代码如下:

public class SomeAction {
    private DataSource ds;
 
    @JndiLookup(jndi="jdbc/mysqlDS", type=DataSource.class)
    public void setDs(DataSource ds) {
        this.ds = ds;
    }
 
    public String execute() {
        //do something about the ds
    }
}

经测试,在tomcat下注入DataSource成功了。看来Annotation和Struts2真的是个好东西呀!

分享到:
评论
1 楼 evonli 2008-04-18  
d                

相关推荐

Global site tag (gtag.js) - Google Analytics