CDI注入依赖中@Produces生成的Bean时出现UnsatisfiedResolutionException异常
异常根因
该UnsatisfiedResolutionException异常表示Quarkus的Arc CDI容器在部署校验阶段,未找到匹配com.example.MessageHandler类型、@Default限定符的托管Bean,核心原因是自定义Maven依赖中的生产者逻辑未被Quarkus识别,常见触发场景如下:
- 生产者类
MessageHandlerProducer未添加CDI作用域注解:Quarkus要求承载@Produces方法的类必须是CDI托管Bean,需要标注@ApplicationScoped、@Singleton等作用域注解,无作用域注解的类不会被容器扫描,其中的生产方法也不会生效。 - 自定义Maven依赖未配置Bean索引:Quarkus默认仅扫描当前项目的类路径资源,第三方依赖如果没有配置CDI Bean索引,内部的CDI类、生产者都不会被容器识别。
@Produces注解导包错误:若误导入JAX-RS的javax.ws.rs.Produces而非CDI规范的javax.enterprise.inject.Produces,注解不会被CDI容器解析。
解决方案
按照以下步骤依次排查修正即可:
- 修正生产者类的注解配置,补充作用域注解,确认导包正确:
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; @ApplicationScoped public class MessageHandlerProducer { @Produces public MessageHandler messageHandler() { return new MessageHandler(); } }
- 给自定义Maven依赖配置Bean索引,二选一即可:
- 方案A:在依赖项目的
src/main/resources/META-INF目录下创建空的beans.xml文件,Quarkus扫描到该文件后会将该依赖识别为合法的CDI Bean归档。 - 方案B:在依赖项目的
pom.xml中添加Jandex插件,构建时生成索引,扫描性能更优:
<build> <plugins> <plugin> <groupId>org.jboss.jandex</groupId> <artifactId>jandex-maven-plugin</artifactId> <version>1.2.3</version> <executions> <execution> <id>generate-index</id> <goals> <goal>jandex</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 若完成上述配置后仍报错,可在核心项目的
application.properties中添加配置,强制扫描对应包路径:
quarkus.arc.additional-bean-packages=com.example # 替换为MessageHandler所在的包名
内容的提问来源于stack exchange,提问作者Omar Malas
相关产品推荐
相关产品推荐

