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

Quarkus中使用TypeLiteral通过Arc.container().instance查找Bean失败

Arc编程式查找Bean时TypeLiteral无法匹配的常见问题

以下是导致get2方法无法找到Bean的几个明显问题:

  • 泛型擦除导致TypeLiteral丢失实际类型信息
    Java的泛型擦除机制会让泛型方法中的T在运行时丢失具体类型信息。你在get2里直接创建new TypeLiteral<T>(){}时,JVM无法识别T的实际类型,Arc容器自然无法匹配到对应的Bean。而get方法传入的Class<T>是具体化的类型实例,不存在擦除问题,所以能准确定位目标Bean。

  • 限定符未正确传递
    JobType应该是用于区分同类型Bean的限定符注解。get方法里肯定是把JobType作为限定符条件传递给了Arc的查找逻辑,但get2方法可能只传入了TypeLiteral,没有同时带上对应的限定符。Arc查找Bean需要同时匹配类型和限定符,缺少限定符会导致容器找不到符合条件的实例。

  • TypeLiteral的使用方式有误
    正确使用TypeLiteral需要通过匿名内部类捕获具体泛型类型(比如new TypeLiteral<OrderService>(){}),但如果是在泛型方法中针对类型参数T创建TypeLiteral,哪怕用了匿名内部类也绕不开泛型擦除。这种情况下需要让调用方预先创建好TypeLiteral实例并传入方法,而不是在方法内部动态生成。

修正示例参考

如果要实现无需传入Class<T>的查找,可以调整方法让调用方传递TypeLiteral<T>实例,同时确保传递对应的限定符:

public static <T> T get2(TypeLiteral<T> typeLiteral, JobType jobType) {
    QualifierInstance qualifier = Arc.container().getQualifierInstance(jobType);
    return Arc.container().instance(typeLiteral, qualifier).get();
}

内容的提问来源于stack exchange,提问作者syr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:39:15