首页 > 解决方案 > 如何在 MongoClient for VertX 中正确处理异常

问题描述

在我的应用程序的启动方法中,我想检查提供给应用程序的 MongoDB 凭据是否正常。如果它们没问题,我继续启动,如果没有,应用程序应该退出,因为它无法连接到数据库。代码片段如下:

  // Create the client
  MongoClient mongodb = null;
  try {
      mongodb = MongoClient.createShared(vertx, mongo_cnf, mongo_cnf.getString("pool_name"));
  }
  catch(Exception e) {
      log.error("Unable to create MongoDB client. Cause: '{}'. Bailing out", e.getMessage());
      System.exit(-1);
  }

如果我提供了错误的凭据,catch则不会调用该块。然而,我在控制台上得到以下信息:

  19:35:43.017 WARN  org.mongodb.driver.connection - Exception thrown during connection pool background maintenance task
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='user', source='admin', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:162)
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:39)
... many lines

问题是:如何在我的代码中拦截这个异常并能够正确处理它?

标签: mongodbvert.xmongo-java-driver

解决方案


该异常发生在 mongodb 的 java 驱动程序守护线程中,因此您无法捕获它。

Vertx MongoClient 将您从与 MongoDB Java 驱动程序的直接交互中抽象出来,因此您无法修改与客户端相关的任何内容。

您可以通过反射访问 mongo 客户端实例,但由于它已经创建,您无法向其传递额外的配置。

如果您使用过,com.mongodb.async.client.MongoClient您可以通过ServerListenerwhich 可以访问异常并且您可以检查它(有关更多详细信息,请参阅此答案 - https://stackoverflow.com/a/46526000/1126831)。

但是只能ServerListener在构建 mongo 客户端时指定,这发生在 Vertx MongoClient 包装器内部,并且无法传递此附加配置。


推荐阅读