JEE6拦截器 - 提取方法变量

时间:2013-09-17 12:53:15

标签: java java-ee-6 cdi interceptor jboss-weld

是否有可能在截获方法时提取一次方法变量的值?我不希望拦截参数但方法中的属性值? e.g。

Business Logic: 

@MyInterceptor
void myMethod(Object o){

 ArrayList myList= null;
 myList= dao.getRecords(o.getId) //intercept the result of this dao call


//I only want to call doWork after I have 'validated' contents of myList in interceptor

 doWork(myList)


}


The Interceptor:  

@Interceptor
@MyInterceptor
MyInterceptor{

@AroundInvoke{
public Object invoke(InvocationContext ctx) throws Exception {

 //retrieve the contents of myList above and perform validation
 //if it passes validation call ctx.proceed else return error

}

}

由于

1 个答案:

答案 0 :(得分:2)

我担心你无法用拦截器真正做到这一点,因为他们无法访问方法内部变量(只需查看InvocationContext javadocs)。所以你唯一的机会就是让myList成为一个bean属性,然后在拦截器中执行此操作。

@AroundInvoke{
public Object invoke(InvocationContext ctx) throws Exception {
    if(ctx.getTarget() instanceof BeanWithListProperty) {
        Object toProceed = ctx.proceed(); 
        BeanWithListProperty bean = (BeanWithListProperty) ctx.getTarget();
        List list = bean.getMyList();
        return toProceed;
    }
    return ctx.proceed();
}

其他选项是使用Decorators,这将使代码更具可读性和效率。

但是我不太喜欢这些解决方案,在我看来,你的代码真的没有很好的设计,你想要实现什么?