我跟随this tutorial将示例应用程序部署到Heroku。我只是在MyResource
类中添加了以下方法,并从中返回了结果,而不是从"Hello World"
方法中返回了getIt()
。我正在连接到Atlas免费套餐集群:
static String getMessage() {
MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://<USER>:<PASSWORD>@cluster0-shard-00-00-2lbue.mongodb.net:27017,cluster0-shard-00-01-2lbue.mongodb.net:27017,cluster0-shard-00-02-2lbue.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin"));
DB database = mongoClient.getDB("mastery");
DBCollection collection = database.getCollection("summary");
DBObject query = new BasicDBObject("_id", new ObjectId("5c563fa2645d6b444c018dcb"));
DBCursor cursor = collection.find(query);
return (String)cursor.one().get("message");
}
这是我正在使用的驱动程序:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.9.1</version>
</dependency>
这是我的导入:
import com.mongodb.*;
该应用程序在我的本地系统上运行良好。但是,当我将应用程序部署到Heroku并点击服务时,我会遇到以下错误:
INFO: Exception in monitor thread while connecting to server cluster0-shard-00-01-2lbue.mongodb.net:27017
com.mongodb.MongoCommandException: Command failed with error 8000 (AtlasError): 'no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.' on server cluster0-shard-00-01-2lbue.mongodb.net:27017. The full response is { "ok" : 0, "errmsg" : "no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.", "code" : 8000, "codeName" : "AtlasError" }
at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:179)
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:299)
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255)
at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:106)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:63)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:127)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.lang.Thread.run(Thread.java:748)
此SNI名称是什么?我可以理解,驱动程序可以从我的机器上拾取它,但不能从Heroku机器上拾取它。但是我对如何解决这个问题一无所知!有没有一种方法可以配置Heroku以在驱动程序要求时显示SNI名称?我们可以从Heroku中的某个地方手动获取该值,然后直接将其馈送到MongoDB驱动程序吗?任何帮助表示赞赏。
编辑:客户端提到它希望连接到的服务器的SNI名称作为turned out,作为TLS安全性的一部分。而且似乎有一种方法可以手动indicate the name in python driver。有什么办法可以从Java中做到这一点吗?仍然感到困惑,为什么在本地运行应用程序时这不是问题。