Quarkus是否有类似Spring Boot Actuator /beans端点的内置Bean查询功能?
Quarkus等效Spring Boot Actuator /beans端点的功能
好问题!Quarkus确实有对应的便捷功能来查看其托管的CDI Bean,不用完全依赖手动编程注入BeanManager,主要分为两种场景:
1. 开发模式专属:Dev UI(最直观)
当你用./mvnw quarkus:dev或./gradlew quarkusDev启动Quarkus应用时,直接访问http://localhost:8080/q/dev就能进入Quarkus的开发者UI界面。
在这个界面里,找到CDI Beans分类(或者在搜索框直接搜"beans"),就能看到所有Quarkus托管的Bean列表,包括每个Bean的类型、作用域、限定符、依赖关系等详细信息——这和Spring Actuator的/beans端点功能完全等效,而且是可视化的界面,排查问题更方便。
2. 生产环境可用:自定义REST端点
如果你需要在生产环境也能提供类似/beans的端点,可以基于你提到的BeanManager封装一个REST接口,下面是一个完善的示例:
import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.enterprise.inject.Any; import jakarta.enterprise.util.AnnotationLiteral; import java.util.Set; import java.util.stream.Collectors; import jakarta.enterprise.inject.spi.Bean; import jakarta.enterprise.inject.spi.BeanManager; @Path("/beans") @ApplicationScoped public class BeanListingResource { @Inject BeanManager beanManager; @GET @Produces(MediaType.APPLICATION_JSON) public Set<String> getAllManagedBeans() { // 获取所有带有@Any限定符的Bean(即所有托管Bean) Set<Bean<?>> beans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() {}); // 转换为Bean类名的集合返回 return beans.stream() .map(Bean::getBeanClass) .map(Class::getName) .collect(Collectors.toSet()); } }
写完后启动应用,访问http://localhost:8080/beans就能拿到JSON格式的Bean列表。如果需要保护这个端点,还可以搭配quarkus-security扩展添加身份验证,避免未授权访问。
3. 额外说明
Quarkus的官方扩展里没有直接提供和/beans完全一致的内置端点,但Dev UI已经完全覆盖了开发时的需求,自定义端点则能满足生产环境的个性化需求。
内容的提问来源于stack exchange,提问作者Jade Devin Nocum Cabatlao
相关产品推荐
相关产品推荐

