如何在Quarkus中获取所有带有@Path注解的Bean?
获取Quarkus中所有带@Path注解的Bean
在Quarkus里要实现类似Spring applicationContext.getBeansWithAnnotation(RestController.class)的功能,注意不能直接通过Arc.container().beanManager().getBeans(...)的参数直接过滤(因为@Path不是CDI限定符注解),正确做法是先获取所有Bean,再筛选出类上标注了@Path的实例。
具体实现代码:
import io.quarkus.arc.Arc; import jakarta.enterprise.inject.spi.Bean; import jakarta.ws.rs.Path; import java.util.Map; import java.util.stream.Collectors; // 获取Quarkus的BeanManager实例 var beanManager = Arc.container().beanManager(); // 筛选并获取所有带@Path注解的Bean实例 Map<String, Object> pathBeans = beanManager.getBeans(Object.class) .stream() // 判断Bean的实现类是否标注了@Path注解 .filter(bean -> bean.getBeanClass().isAnnotationPresent(Path.class)) // 将符合条件的Bean转换为实例并以名称-实例的映射形式返回 .collect(Collectors.toMap( Bean::getName, bean -> beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)) ));
参数说明:
beanManager.getBeans(Object.class):传入Object.class作为第一个参数,表示获取所有类型的Bean(我们只关注是否带@Path注解,不限制Bean的具体类型)。- 方法的第二个参数
Annotation... var2用于传递CDI限定符注解,而@Path是JAX-RS的资源标识注解,不属于CDI限定符范畴,所以不能直接传入Path.class实例来筛选,必须通过后续的流过滤逻辑实现。
和Spring方法的差异:
Spring的getBeansWithAnnotation直接封装了“按类级注解筛选Bean”的逻辑,而Quarkus基于CDI规范的BeanManager没有提供直接的封装方法,需要我们手动通过流过滤完成相同效果。
内容的提问来源于stack exchange,提问作者abel saju
相关产品推荐
相关产品推荐

