我正在使用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
}
}
答案 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)