Quarkus自定义MongoClient时遭遇AmbiguousResolutionException异常
Quarkus自定义MongoClient注入冲突的解决办法
问题原因
你遇到的AmbiguousResolutionException是因为Quarkus MongoDB扩展的自动配置机制:当配置文件(如application.properties)中存在以quarkus.mongodb.customClient.开头的配置项时,扩展会自动生成一个带有@MongoClientName("customClient")的合成MongoClient Bean,这就和你自己通过生产者方法创建的同名Bean产生了依赖歧义。
解决办法
方法1:移除自动配置触发源
直接删除配置文件中所有以quarkus.mongodb.customClient.开头的配置项,Quarkus扩展就不会自动生成对应的合成Bean,此时容器中只会存在你自定义的生产者Bean,注入歧义自然消除。
方法2:用自定义限定符区分Bean
如果需要同时保留Quarkus自动配置的客户端和自定义客户端,可以通过自定义限定符区分两者:
- 创建自定义限定符注解:
@Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public @interface CustomMongoClient { }
- 修改生产者方法,添加自定义限定符:
@ApplicationScoped public class MongoClientProducer { String connectionString = "mongodb+srv://..."; @Produces @CustomMongoClient // 添加自定义限定符 public MongoClient createMongoClient() { CodecRegistry codecRegistry = CodecRegistries.fromRegistries( CodecRegistries.fromCodecs(new CustomCodec()), MongoClientSettings.getDefaultCodecRegistry() ); MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(codecRegistry) .applyConnectionString(new ConnectionString(connectionString)) .build(); return MongoClients.create(settings); } }
- 修改服务类的注入点,使用自定义限定符:
@ApplicationScoped public class MyService implements SomeInterface{ @Inject @CustomMongoClient // 使用自定义限定符注入 MongoClient customMongoClient; ... }
方法3:禁用特定命名客户端的自动配置
在application.properties中添加配置,直接禁用该命名客户端的自动生成:
quarkus.mongodb.customClient.enabled=false
这样Quarkus扩展就不会为customClient生成合成Bean,只保留你自定义的生产者Bean。
验证
修改完成后重新启动应用,AmbiguousResolutionException会消失,自定义MongoClient可正常注入使用。
内容的提问来源于stack exchange,提问作者avl
相关产品推荐
相关产品推荐

