从CDI托管bean

时间:2016-07-18 10:47:40

标签: java java-ee cdi

我想从方法中检索注释(自定义的注释)。通常我可以通过访问

来询问类加载器
class.getMethod("methodName").getAnnotation("annotationName")

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

有没有什么好方法可以从CDI托管bean中检索anntations?

详细说明我的代码是这样的: 我创建了一个注释" 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-Decorator中完成它,因此我无法使用拦截器绑定。

目前我的方法是使用反射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实现增强的类的检测非常糟糕。

1 个答案:

答案 0 :(得分:0)

也许尝试使用BeanManager - 您将希望使用它来获取您的bean的https://spark.apache.org/docs/1.1.1/mllib-guide.html实例。这里的方法有所不同,基于它是什么类型的bean。通过API洗牌并找到自己的方式。

获得Bean<?>之后,您应该可以使用getBeanClass(),然后您就可以访问方法及其注释。