hosts 不能为 null - 创建与 MongoDB 4.2 数据库的 POJO 连接时出现异常
hosts can not be null - exception when creating POJO connection to MongoDB 4.2 database
在 Mongo 3.6 中,以下代码使用自动 POJO 映射连接到数据库:
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
mongoClient = new MongoClient("localhost",
MongoClientOptions.builder().codecRegistry(pojoCodecRegistry).build());
在 Mongo 4.2 中,classes 略有变化。重要的是,新 MongoClients class 的 create()
方法不支持旧构造函数支持的 "localhost"
String 参数。这意味着文档 (https://mongodb.github.io/mongo-java-driver/4.0/driver/getting-started/quick-start-pojo/) 的快速入门 - POJO 部分中提供的示例不起作用。
33 CodecRegistry pojoCodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
34 fromProviders(PojoCodecProvider.builder().automatic(true).build()));
35
36 MongoClientSettings settings = MongoClientSettings.builder()
37 .codecRegistry(pojoCodecRegistry)
38 .build();
39
40 mongoClient = MongoClients.create(settings);
我在 Tomcat 9 上 运行 并收到以下异常:
java.lang.IllegalArgumentException: hosts can not be null
com.mongodb.assertions.Assertions.notNull(Assertions.java:37)
com.mongodb.connection.ClusterSettings.<init>(ClusterSettings.java:446)
com.mongodb.connection.ClusterSettings.<init>(ClusterSettings.java:43)
com.mongodb.connection.ClusterSettings$Builder.build(ClusterSettings.java:260)
com.mongodb.MongoClientSettings.<init>(MongoClientSettings.java:733)
com.mongodb.MongoClientSettings.<init>(MongoClientSettings.java:59)
com.mongodb.MongoClientSettings$Builder.build(MongoClientSettings.java:481)
com.ossltd.whm.MongoDB.<init>(MongoDB.java:38)
...
这是与 Tomcat 在同一服务器上的 MongoDB 运行 的单个实例。如何为此连接设置主机值?或者我应该做些什么来获得与第一个示例相同类型的连接?
问题是由 war 文件中包含的冲突 jar 引起的。
我只是在尝试将我的 pom.xml 与一个较旧的工作项目进行比较时偶然发现的。我误以为我在这个新项目中使用的是 3.6.0 jar 文件,但是 Eclipse 中的 Maven 依赖项和使用 mvn dependency:tree
只显示 4.0.4 jar 文件。
当我检查 war 文件的实际内容时(在我安装的 webapp 的 /WEB-INF/lib 目录中),我发现它包含 Mongo 3.6.0 jar 、4.0.4 遗留 jar 和 4.0.4 同步 jar 文件。尽管我之前尝试过,但我无法在我当前的项目中找到任何可以将它们包含在内的引用。
解决方案是简单地确保我的构建目标在 tomcat7:redeploy
.
之前包含 clean
似乎正在更新 war 文件,而不是按照 tomcat7:redeploy
目标重新创建。
在 Mongo 3.6 中,以下代码使用自动 POJO 映射连接到数据库:
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
mongoClient = new MongoClient("localhost",
MongoClientOptions.builder().codecRegistry(pojoCodecRegistry).build());
在 Mongo 4.2 中,classes 略有变化。重要的是,新 MongoClients class 的 create()
方法不支持旧构造函数支持的 "localhost"
String 参数。这意味着文档 (https://mongodb.github.io/mongo-java-driver/4.0/driver/getting-started/quick-start-pojo/) 的快速入门 - POJO 部分中提供的示例不起作用。
33 CodecRegistry pojoCodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
34 fromProviders(PojoCodecProvider.builder().automatic(true).build()));
35
36 MongoClientSettings settings = MongoClientSettings.builder()
37 .codecRegistry(pojoCodecRegistry)
38 .build();
39
40 mongoClient = MongoClients.create(settings);
我在 Tomcat 9 上 运行 并收到以下异常:
java.lang.IllegalArgumentException: hosts can not be null
com.mongodb.assertions.Assertions.notNull(Assertions.java:37)
com.mongodb.connection.ClusterSettings.<init>(ClusterSettings.java:446)
com.mongodb.connection.ClusterSettings.<init>(ClusterSettings.java:43)
com.mongodb.connection.ClusterSettings$Builder.build(ClusterSettings.java:260)
com.mongodb.MongoClientSettings.<init>(MongoClientSettings.java:733)
com.mongodb.MongoClientSettings.<init>(MongoClientSettings.java:59)
com.mongodb.MongoClientSettings$Builder.build(MongoClientSettings.java:481)
com.ossltd.whm.MongoDB.<init>(MongoDB.java:38)
...
这是与 Tomcat 在同一服务器上的 MongoDB 运行 的单个实例。如何为此连接设置主机值?或者我应该做些什么来获得与第一个示例相同类型的连接?
问题是由 war 文件中包含的冲突 jar 引起的。
我只是在尝试将我的 pom.xml 与一个较旧的工作项目进行比较时偶然发现的。我误以为我在这个新项目中使用的是 3.6.0 jar 文件,但是 Eclipse 中的 Maven 依赖项和使用 mvn dependency:tree
只显示 4.0.4 jar 文件。
当我检查 war 文件的实际内容时(在我安装的 webapp 的 /WEB-INF/lib 目录中),我发现它包含 Mongo 3.6.0 jar 、4.0.4 遗留 jar 和 4.0.4 同步 jar 文件。尽管我之前尝试过,但我无法在我当前的项目中找到任何可以将它们包含在内的引用。
解决方案是简单地确保我的构建目标在 tomcat7:redeploy
.
clean
似乎正在更新 war 文件,而不是按照 tomcat7:redeploy
目标重新创建。