我正在使用 Seam 使用 @In 注释将 bean 注入到我的控制器中。注入的类有一个自定义注释,当调用injectedClass.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 类本身。
对于每个 bean 类,Seam 创建一个组件定义,其中存储在应用程序上下文中。属性的名称遵循以下模式:元件名称 plus 。成分。所以如果你有一颗像这样的豆子
@Name("myBean")
public class MyBean {
}
其组件定义存储在属性中myBean.组件
所以在你的方法中,你可以使用
Component myBeanComponentDefinition = (Component) Context.getApplicationContext().get("myBean.component");
现在你可以打电话
myBeanComponentDefinition.getBeanClass().getAnnotation(CustomAnnotation.class);
regards,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)