查询失败,错误代码 13 在 mongodb 查找查询中名称为"未经授权"



我在Java J2EE应用程序中进行mongodb驱动程序迁移。之前我们使用的是依赖项:

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.mongodb.morphia</groupId>
<artifactId>morphia</artifactId>
<version>1.3.2</version>
</dependency>

现在我们用这个

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.6.1</version>
</dependency>

我们有一个管理数据库,其中包含一个包含文档的集合。前面的连接方法是这样实现的:

MongoClient mongoClient = new MongoClient(serverList, Arrays.asList(MongoCredential.createCredential(username, "admin", password.toCharArray())), builder.build());
Morphia morphia = new Morphia();
morphia.getMapper().getOptions().setMapSubPackages(true);
morphia.mapPackage(entitiesPackage);
Datastore datastore = morphia.createDatastore(mongoClient, "mycollection");

现在我们有:

CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromProviders(pojoCodecProvider));
MongoClient client = MongoClients.create(uri);
MongoCollection collection = client.getDatabase("admin").withCodecRegistry(pojoCodecRegistry).getCollection("mycollection");

与此连接字符串:

mongodb://<username>:<password>@<mongodb_server_address>:27017

这个连接是OK的,因为在我的wildfly开始时,我可以看到谁说Mongodb连接的日志,但当应用程序尝试使用此语法从Mongodb数据库获取数据:

collection.find(MyEntity.class).first(); 

我们有这个错误:

Caused by: java.lang.RuntimeException: com.mongodb.MongoQueryException: Query failed with error code 13 with name 'Unauthorized' and error message 'not authorized on admin to execute command { find: "mycollection", filter: {}, limit: 1, singleBatch: true }' on server mongodb_server_address:27017
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:257)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:105)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:87)
... 8 more

这不是凭证,因为在旧版本中一切都很好,

我这样解决我的问题:

连接字符串:

mongodb://<username>:<password>@<my_server_address>:27017/<dbname>?authSource=admin
CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), CodecRegistries.fromProviders(pojoCodecProvider));
MongoClient client = MongoClients.create(uri);
MongoDatabse database = client.getDatabase(dbName).withCodecRegistry(pojoCodecRegistry);