Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
heroku java应用程序中的MongoDB“未发送SNI名称”错误_Mongodb_Heroku_Mongodb Java_Sni_Mongodb Atlas - Fatal编程技术网

heroku java应用程序中的MongoDB“未发送SNI名称”错误

heroku java应用程序中的MongoDB“未发送SNI名称”错误,mongodb,heroku,mongodb-java,sni,mongodb-atlas,Mongodb,Heroku,Mongodb Java,Sni,Mongodb Atlas,我随后向Heroku部署了一个示例应用程序。我只是在MyResource类中添加了下面的方法,并从中返回结果,而不是从getIt方法返回Hello World。我正在连接到一个atlas免费层群集: static String getMessage() { MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://<USER>:<PASSWORD>@cluster0-sh

我随后向Heroku部署了一个示例应用程序。我只是在MyResource类中添加了下面的方法,并从中返回结果,而不是从getIt方法返回Hello World。我正在连接到一个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");
    }
应用程序在我的本地系统中运行良好。但当我将应用程序部署到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名称,作为TLS安全性的一部分。而且似乎有一种方法可以手动操作。有什么方法可以从java实现这一点吗?仍然不明白为什么在本地运行应用程序时这不是一个问题。

我用来连接集群的代码被证明是错误的。我遵循了公司的指示,其中提到:

要连接到Atlas M0免费层群集,必须使用Java 版本8或更高版本,并使用支持 MongoDB 3.4

因此,我在system.properties文件中将java版本更改为1.8:

此前设定为1.7。我还收到了一条关于我使用过的一种方法的弃用警告。因此,我再次遵循了使用最新代码的原则,它就像一个符咒

这里真正的要点是每次都参考官方文件:

import com.mongodb.*;
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)
java.runtime.version=1.8