丢失代理类的类自定义注释

时间:2009-12-30 11:33:00

标签: java proxy seam

我正在使用Seam使用@In注释将bean注入我的控制器。注入的类有一个自定义注释,当调用injectClass.getClass()。getAnnotation(annotationClass)时,它返回null。

调试时我发现Seam传递了一个代理实例,所以getClass()返回没有自定义注释的InjectedClass _ $$ _ javassist_seam_5。

如何从代理类中获取自定义注释?

以下是我的课程的样子:

@CustomAnnotation(value="myvalue")
@Name("myAnnotatedClass")
public class MyAnnotatedClass extends SuperClass {...}

@Scope(ScopeType.SESSION)
@Name("myController")
public class MyController {
     @In("#{myAnnotatedClass}")
     private MyAnnotatedClass myAnnotatedClass;

     public void actionMethod(){
         //call another class which call myAnnotatedClass.getClass().getAnnotation(CustomAnnotation.class)
         //then do some reflection for MyAnnotatedClass fields 
     }
}

2 个答案:

答案 0 :(得分:3)

好问题。

当您使用Seam调用方法时,它会被代理拦截。这个可以实现@In或@ Out-jction。但是这个规则有一个例外:当你调用内部方法时它不起作用

所以试试这段代码

@Name
public class Service {

    @In
    private MyAnnotatedClass myAnnotatedClass;


    public void myInterceptedMethod() {
        // internal method bypass interceptor
        // So @In or @Out-jection is not enabled
        internalMethod();
    }

    private void internalMethod() {
        System.out.println(myAnnotatedClass.getClass().getAnnotation(annotationClass));
    }

}

添加到原始回答

您想要从bean中检索注释。但是,由于方法拦截器,myAnnotatedClass.getClass()返回一个代理对象,而不是bean类本身。

对于每个bean类,Seam创建一个Component定义,其中存储在应用程序上下文中。属性的名称遵循以下模式:组件名称加上 .component 。所以,如果你有像这样的bean

@Name("myBean")
public class MyBean {

}

其Componet定义存储在属性 myBean.component

所以在你的方法中,你可以使用

Component myBeanComponentDefinition = (Component) Context.getApplicationContext().get("myBean.component");

现在你可以打电话了

myBeanComponentDefinition.getBeanClass().getAnnotation(CustomAnnotation.class);

的问候,

答案 1 :(得分:0)

如果你想要更少的“ComponentDefinition”overbloat,你也可以使用它也适用于CDI和Spring:

Class.forName(myBean.getClass().getCanonicalName().substring(0,myBean.getClass().getCanonicalName().indexOf("$"))).getAnnotation(MyAnnotation.class)