You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用getBeansWithAnnotation后isAnnotationPresent返回false问题排查

自定义注解@EnableFoo参数获取问题及解决方法

自定义注解定义

在自定义库中定义了如下@EnableFoo注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Configuration
@ComponentScan(
    basePackages = {
      "com.***",
      ....
    })
public @interface EnableFoo {
  String[] urls();
}

客户端使用方式

引入该库的客户端通过如下方式使用该注解:

@EnableFoo(
    urls = { "some-url", ... })

遇到的问题

为了获取该注解的urls参数,编写了如下代码:

private List<String> initFoo() {

    var beans = ctx.getBeansWithAnnotation(EnableFoo.class);

    if (beans.size() != 1) {
      throw new IllegalStateException(
          "Multiple '@" + EnableFoo.class.getName() + "' declarations !");
    }

    Object bean = beans.values().iterator().next();

    Class<?> clazz = bean.getClass();
    if (clazz.isAnnotationPresent(EnableFoo.class)) { // <--- 返回false!!
         String[] annotationUrls = clazz.getAnnotation(EnableFoo.class).urls();
         ....
    }
}

明明通过ctx.getBeansWithAnnotation(EnableFoo.class)拿到了对应的bean,但调用clazz.isAnnotationPresent(EnableFoo.class)却返回false。后续尝试使用AnnotationUtils.getAnnotation获取注解,同样返回null:

var annotation =
    AnnotationUtils.getAnnotation(
        AopProxyUtils.ultimateTargetClass(bean),
        EnableFoo.class);

解决方法

在@M. Deinum的提示下,改用AnnotationUtils.findAnnotation成功解决了问题:

var annotation =
    AnnotationUtils.findAnnotation(
        bean.getClass(), EnableFoo.class);

内容的提问来源于stack exchange,提问作者Hayi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:20:48