Quarkus中CDI无法注入MongoClient的问题求助
解决Quarkus中CDI无法注入MongoClient的问题
问题重现
尝试直接注入com.mongodb.reactivestreams.client.MongoClient时项目启动报错:
Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type com.mongodb.reactivestreams.client.MongoClient and qualifiers [@Default] - java member: edu.kmaooad.capstone23.relations.dal.RelationRepository#mongoClient - declared on CLASS bean [types=[edu.kmaooad.capstone23.relations.dal.RelationRepository, java.lang.Object], qualifiers=[@Default, @Any], target=edu.kmaooad.capstone23.relations.dal.RelationRepository] ...(省略后续堆栈信息)
相关代码实现:
package edu.kmaooad.capstone23.relations.dal; import com.mongodb.client.model.Filters; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.bson.types.ObjectId; import org.eclipse.microprofile.config.inject.ConfigProperty; import java.util.Optional; @ApplicationScoped public class RelationRepository { @Inject MongoClient mongoClient; @ConfigProperty(name = "quarkus.mongodb.database") String databaseName; // TODO handle the result of insertOne public Optional<Relation> createRelation(String collectionName1, String collectionName2, Relation relation) { var collection = getRelationCollection(collectionName1, collectionName2); collection.insertOne(relation); return Optional.of(relation); } // TODO handle the result of deleteOne public boolean deleteRelation(String collectionName1, String collectionName2, ObjectId id) { var collection = getRelationCollection(collectionName1, collectionName2); collection.deleteOne(Filters.eq("_id", id)); return true; } private MongoCollection<Relation> getRelationCollection(String collectionName1, String collectionName2) { var collectionName = getRelationCollectionName(collectionName1, collectionName2); var database = mongoClient.getDatabase(databaseName); return database.getCollection(collectionName, Relation.class); } private String getRelationCollectionName(String collectionName1, String collectionName2) { return collectionName1 + "-to-" + collectionName2; } }
此前使用PanacheMongoRepository时,可通过QUARKUS_MONGODB_CONNECTION_STRING环境变量正常连接数据库。
解决方案
1. 检查并添加对应依赖
Quarkus的MongoDB扩展分为同步和反应式两个版本,对应不同的MongoClient类型:
- 若要注入
com.mongodb.reactivestreams.client.MongoClient(反应式),需添加quarkus-mongodb-reactive依赖:
或Gradle配置:<!-- Maven 依赖 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-mongodb-reactive</artifactId> </dependency>// Gradle 依赖 implementation 'io.quarkus:quarkus-mongodb-reactive' - 若无需反应式能力,可改为注入
com.mongodb.client.MongoClient(同步版),确保依赖为quarkus-mongodb:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-mongodb</artifactId> </dependency>
2. 验证数据库配置
即使之前Panache能正常工作,也需确认配置有效性:
- 检查环境变量
QUARKUS_MONGODB_CONNECTION_STRING是否正确,格式示例:mongodb://username:password@host:port - 也可在
application.properties中显式配置:quarkus.mongodb.connection-string=${QUARKUS_MONGODB_CONNECTION_STRING} quarkus.mongodb.database=your-database-name
3. 手动创建MongoClient Producer(备选方案)
若上述方法无效,可手动提供CDI Bean供注入:
package edu.kmaooad.capstone23.relations.dal; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped public class MongoClientProducer { @ConfigProperty(name = "quarkus.mongodb.connection-string") String connectionString; @Produces @ApplicationScoped public MongoClient produceMongoClient() { return MongoClients.create(connectionString); } }
内容的提问来源于stack exchange,提问作者Capy Maths
相关产品推荐
相关产品推荐

