调用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
相关产品推荐
相关产品推荐

