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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:45:10