我在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);