当前位置: 首页 > 知识库问答 >
问题:

从CDI托管bean获取方法的注释

慕容灿
2023-03-14

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

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实现增强的类的检测非常糟糕。

共有1个答案

何雅惠
2023-03-14

也许可以使用BeanManager-您将希望使用它来获取Bean

一旦你得到了Bean

 类似资料:
  • 我认为有两种一般的方法可以通过BeanManager获取自动创建的CDI托管bean实例,当仅具有一个Bean时 > 通过,通常在代码段中显示: 通过,这在代码段中很少显示: 实际上,它们最终做了完全相同的事情:返回对当前CDI托管bean实例的代理引用,并在范围中不存在bean实例时自动创建该实例。 但是它们的做法有点不同:BeanManager#getReference()总是创建一个全新的代

  • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati

  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 我很难在一个使用JSF 2、Facelets和CDI的(非常简单的)WAR项目中获得一个通用的错误页面。 我的应用服务器是WebLogic12c,它应该支持所有这些现成的功能,但它无法显示错误页面。当我将完全相同的WAR部署到Glassfish应用程序服务器时,它可以工作。 我倾向于指责WebLogic在CDI部门存在缺陷,但可以使用一些额外的专业知识来检查我的方法是否错误。 以下是我的应用程序试

  • 我正在用CDI开发一个库。这个很好用。但是,当我试图将这个库用作项目中包含的Jar时,CDI抱怨说它无法解决对父项目中定义的托管bean的依赖关系。 MyProject-MyLib。jar-MyManagedBean 所以MyLib需要注入一个带有原型@foo注释的bean。此原型应用于MyManagedBean。 我加了豆子。我的父项目也使用xml。但好像有两个不同的CDI容器,MyLib无法访

  • 在我正在构建的应用程序中,我们使用直Java6 EE和JBoss(没有Spring等),以及JPA/Hibernate、JSF、CDI和EJB。 我还没有找到很多好的通用安全解决方案(欢迎推荐),但我找到的最佳选择是ApacheShiro。 然而,这似乎有一些缺点。您可以在Balus C的网站上阅读其中一些内容: http://balusc.blogspot.com/2013/01/apache-