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

Quarkus扩展的JAX-RS Provider无法注入CDI Bean问题求助

根因说明

该问题的核心原因是Quarkus不会自动扫描扩展依赖中的CDI注解和JAX-RS @Provider注解,仅会扫描当前应用的类路径资源。因此你将代码放到独立应用中运行时组件可以被正常识别注册,做成扩展后需要手动通过构建项声明需要注册的组件。

解决方案
  • 补全CDI Bean注册:你当前的AdditionalBeanBuildItem仅注册了ErrorMessageUtilProducer,位于扩展中的ExceptionMapper类需要手动添加到CDI注册列表中,修改QuarkusErrorHandlingProcessor的对应方法:
@BuildStep
public AdditionalBeanBuildItem additionalBeanBuildItem() {
    return AdditionalBeanBuildItem.builder()
            .addBeanClass(ErrorMessageUtilProducer.class)
            .addBeanClass(BaseExceptionHandler.class)
            // 其余自定义的ExceptionMapper类依次添加到此处
            .setUnremovable()
            .build();
}

删除原配置中的setDefaultScope(DotNames.SINGLETON)配置,你的ErrorMessageUtilProducer类上已经标注了@ApplicationScoped注解,不需要额外设置默认作用域,避免作用域冲突。

  • 显式注册JAX-RS Provider:扩展中的@Provider注解不会被自动识别为JAX-RS组件,需要新增构建步骤注册,确保Resteasy使用CDI管理的Mapper实例:
@BuildStep
public JaxrsProvidersToRegisterBuildItem registerExceptionMappers() {
    return new JaxrsProvidersToRegisterBuildItem(
            BaseExceptionHandler.class
            // 其余自定义的ExceptionMapper类依次添加到此处
    );
}
验证排查方式

在测试的配置文件中加入配置项quarkus.arc.dump-generated-resources=true,启动测试后查看生成的arc-generated-beans.txt文件,确认你的所有ExceptionMapper和ErrorMessageUtil都已经被正常注册为CDI Bean。

内容的提问来源于stack exchange,提问作者Ronald R. DiFrango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:45:01