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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:05:01