Quarkus无法找到已定义Bean列表的问题排查求助
问题分析与解决方案
第一个错误:Instance<ProcessingStrategy>注入时的构造器问题
错误提示核心原因:MyServiceImpl使用了@AllArgsConstructor注解,该注解会生成全参构造器,覆盖了Java默认的无参构造器。而CDI对@ApplicationScoped的Bean生成代理对象时,要求类必须具备非私有的无参构造器(代理类需要通过无参构造器创建实例)。
解决方法
- 手动添加非私有无参构造器:
@ApplicationScoped @AllArgsConstructor public class MyServiceImpl implements DispatcherService { // 手动添加无参构造器 public MyServiceImpl() {} @Inject private Instance<ProcessingStrategy> processingStrategies; // ... 其他业务代码 }
- 或者替换
@AllArgsConstructor为@RequiredArgsConstructor(仅生成必填字段的构造器),此时Java会自动生成默认无参构造器(前提是类中没有显式声明其他构造器)。
第二个错误:直接注入List<ProcessingStrategy>失败
CDI标准规范中,不会自动将同类型的所有Bean实例注入为List。直接声明private final List<ProcessingStrategy> processingStrategies时,容器无法找到匹配的Bean,因此报错“对类型java.util.List<ProcessingStrategy>的依赖未满足”。
解决方法
推荐使用标准CDI的InstanceAPI获取所有实例,再转换为List:
@ApplicationScoped public class MyServiceImpl implements DispatcherService { private final Instance<ProcessingStrategy> processingStrategies; // 构造器注入(CDI推荐方式,无需额外无参构造器) @Inject public MyServiceImpl(Instance<ProcessingStrategy> processingStrategies) { this.processingStrategies = processingStrategies; } // 按需转换为List private List<ProcessingStrategy> getStrategyList() { return processingStrategies.stream().collect(Collectors.toList()); } // ... 其他业务代码 }
如果使用Quarkus、Weld等CDI扩展实现,部分支持直接注入List<ProcessingStrategy>,但这属于非标准特性,建议优先使用标准Instance方式保证兼容性。
此外需确保ProcessingStrategy1和ProcessingStrategy2所在的包处于CDI容器的扫描范围内,否则容器无法识别这两个Bean。
内容的提问来源于stack exchange,提问作者zond
相关产品推荐
相关产品推荐

