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

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依赖:
    <!-- Maven 依赖 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-mongodb-reactive</artifactId>
    </dependency>
    
    或Gradle配置:
    // 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:25:03