【问题标题】:get annotation on method from a CDI managed bean从 CDI 托管 bean 获取方法注释
【发布时间】:2016-07-18 10:47:40
【问题描述】:

我想从方法中检索注释(自定义编写的注释)。通常我可以通过访问来询问类加载器

class.getMethod("methodName").getAnnotation("annotationName")

但如果 bean 由 CDI 容器管理(我使用的是 OpenWebBeans),则该类在运行时得到增强。然后我必须使用超类来请求注释。目前,我尝试通过在类名中查找“$$”来检测该类是否被管理。但这对我来说似乎是一个非常肮脏的解决方案。

有什么好方法可以从 CDI 托管 bean 中检索注释吗?

详细来说,我的代码是这样的: 我创建了一个注释“Coolnessfactor”来标记一个非常酷的方法:-)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Coolnessfactor {
    CoolnessValue value();
}

通过枚举 CoolnessValue 我想指定方法实现有多酷。

public enum CoolnessValue {
    POOR, VERY_COOL, UNBELIEVABLE;
}

然后我在我的业务类中用这个注解标记不同的方法,fe:

@Override
@Coolnessfactor(CoolnessValue.POOR)
public void getSingleObjectWithDetails(final Integer techId) {
    return this.dao.findCompleteDataByPrimaryKey(techId);
}

现在我想分析标记不同方法的注释的值。我必须在 CDI 装饰器中执行此操作,因此无法使用拦截器绑定执行此操作。

目前我的方法是使用反射API来检索注解值:

public static <A extends Annotation> Map<String, A> getAnnotatedMethodsOfClass(final Class<?> clazz,
        final Class<A> annotationClazz) {
    final Map<String, A> annotationMap = new HashMap<String, A>();
    Method[] declaredMethods;
    if (clazz.getName().contains("$$")) {
        declaredMethods = clazz.getSuperclass().getDeclaredMethods();
    } else {
        declaredMethods = clazz.getDeclaredMethods();
    }
    for (final Method m : declaredMethods) {
        if (m.isAnnotationPresent(annotationClazz)) {
            annotationMap.put(m.getName(), m.getAnnotation(annotationClazz));
        }
    }
    return annotationMap;
}

但这对我来说看起来很糟糕。尤其是通过 CDI 实现增强的类的检测非常糟糕。

【问题讨论】:

  • 您能否详细说明您要达到的目标?
  • BeanManager 对您有用吗?
  • 你想用 CDI bean 上的注释来实现什么?也许(疯狂猜测)CDI 拦截器会更合适?
  • 很抱歉不够详细。我在问题中添加了更多代码细节。
  • 我不知道 BeanManager 在这种情况下是否对我有帮助。我试图通过 API 进行扫描,但没有发现任何真正有用的东西。

标签: java jakarta-ee cdi


【解决方案1】:

也许用BeanManager 试试——你会想用它来获取你的bean 的Bean&lt;?&gt; 实例。这里的方法有所不同,具体取决于它是什么类型的 bean。随机浏览 API 并找到自己的方式。

获得Bean&lt;?&gt; 后,您应该能够使用getBeanClass() 并获得对方法及其注释的访问权限。

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2015-04-20
    • 2016-07-09
    • 2013-12-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多