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

