编程语言
首页 > 编程语言> > java-丢失代理类的类自定义注释

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

作者:互联网

我正在使用Seam使用@In注释将bean注入控制器.注入的类具有自定义注释,当调用InjectionClass.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 
     }
}

解决方法:

好问题.

当您使用Seam调用方法时,该方法会被代理拦截.而这一启用@In或@ Out-jection.但是,此规则有一个例外:调用内部方法时,该规则不起作用

所以试试这段代码

@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类本身.

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

@Name("myBean")
public class MyBean {

}

它的Componet定义存储在属性myBean.component中

因此,在您的方法内部,您可以使用

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

现在你可以打电话

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

问候,

标签:proxy,java,seam
来源: https://codeday.me/bug/20191210/2101142.html