使用Java 3.0驱动程序检查MongoDB身份validation

我目前正在尝试使用(相对)新的3.0 Java驱动程序连接到MongoDB副本集。 但是,我似乎无法捕获用户提供错误凭据时发生的MongoSecurityExceptions。 这是我目前的代码。

try { MongoClientURI mongoClientURI = new MongoClientURI("mongodb://:@member1.com:27017/?authSource=db" this.mongoClient = new MongoClient(mongoClientURI); } catch(Exception e) { // TODO: some proper exception handling System.err.println(e.toLocalizedMessage()); } 

使用正确的凭据运行时,此代码可以正常工作,但是在提供错误的凭据时,会在try-catch之外抛出exception。

 com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='', source='', password=, mechanismProperties={}} at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:61) at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32) at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:99) at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:44) at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127) at java.lang.Thread.run(Thread.java:745) 

知道在哪里处理身份validationexception?

MongoClient构造函数不会抛出任何与连接相关的exception。 相反,它们在启动一个或多个后台线程后立即返回,这些后台线程尝试建立连接并根据提供的凭据进行身份validation。

只有当应用程序使用MongoClient在MongoDB服务器上执行某些操作时才会抛出exception。 但是,该exception是一个通用超时exception,表示在服务器选择超时到期之前,驱动程序无法为操作找到合适的服务器。 例如:

  MongoClient client = new MongoClient(asList(new ServerAddress("localhost"), new ServerAddress("localhost:27018")), singletonList(MongoCredential.createCredential("username", "admin", "bad".toCharArray())), MongoClientOptions.builder().serverSelectionTimeout(1000).build()); try { client.getDB("admin").command("ping"); } catch (MongoTimeoutException e) { // do something } 

将在1秒后抛出一个MongoTimeoutException。 虽然没有抛出MongoSecurityException,但MongoTimeoutException的消息将包含相关的详细信息。 例如,当其中一个服务器关闭时连接到三个成员副本集,并且其余两个服务器上的身份validation失败时,MongoTimeoutException的消息字段将类似于:

在等待与ReadPreferenceServerSelector {readPreference = primary}匹配的服务器时,在1000毫秒后超时。 群集状态的客户端视图是{type = UNKNOWN,servers = [{address = localhost:27017,type = UNKNOWN,state = CONNECTING,exception = {com.mongodb.MongoSocketOpenException:Exception opening socket},由{java.net引起。 ConnectException:Connection refused}},{address = localhost:27018,type = UNKNOWN,state = CONNECTING,exception = {com.mongodb.MongoSecurityException:exceptionvalidationMongoCredential {mechanism = null,userName =’username’,source =’admin’ ,password =,mechanismProperties = {}}},由{com.mongodb.MongoCommandException导致:命令失败,错误18:’身份validation失败。’ 在服务器localhost:27018。 完整的响应是{“ok”:0.0,“code”:18,“errmsg”:“身份validation失败。” }}}]