java - 无法在 Heroku 上使用 Java 驱动程序连接 MongoDB

标签 java mongodb maven heroku nullpointerexception

我正在 Heroku 上使用 Java 和 MongoDB 构建一个 Web 应用程序。这个项目是我从here了解到的。我已经连续尝试了两天了。

我使用3.2.2 mongo-java-driver3.5.1 maven-compiler-plugin

这是在我的Main类中:

public static void main(String[] args) throws MongoException, UnknownHostException, Exception {
    MongoClientURI uri = new MongoClientURI(System.getenv("MONGOHQ_URL"));
    MongoClient mongoClient = new MongoClient(uri);

    String dbname = uri.getDatabase();

    //mongoClient.setWriteConcern(WriteConcern.JOURNALED);
    DB db = mongoClient.getDB(dbname);

    staticFileLocation("/public");
    new TodoResource(new TodoService(db));

    MongoCredential credential = MongoCredential.createCredential(uri.getUsername(),dbname,uri.getPassword());
    MongoClientOptions mongoClientOptions = MongoClientOptions.builder().build();
}

我得到了这个错误:

1:38:42 AM web.1 | Exception in thread "main"
1:38:42 AM web.1 | java.lang.NullPointerException
1:38:42 AM web.1 | at com.mongodb.MongoClientURI.<init>   (MongoClientURI.java:174…
1:38:42 AM web.1 | at com.mongodb.MongoClientURI.<init> (MongoClientURI.java:159…
1:38:42 AM web.1 | at Main.main(Main.java:32)

这是NullPointerException,所以我尝试将MONGOHQ_URL替换为mongodb://user:passwd@host1:port1,host2:port2/dbname,我也尝试在Heroku上使用mLab MongoDB,但出现同样的错误:

11:17:05 AM web.1 |  SLF4J: Class path contains multiple SLF4J bindings.
11:17:05 AM web.1 |  SLF4J: Found binding in [jar:file:/Users/zhugejunwei/full-sta…
11:17:05 AM web.1 |  SLF4J: Found binding in [jar:file:/Users/zhugejunwei/full-sta…
11:17:05 AM web.1 |  SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings …
11:17:05 AM web.1 |  SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerF…
11:17:05 AM web.1 |  Exception in thread "main" java.lang.NullPointerException
11:17:05 AM web.1 |     at com.mongodb.ConnectionString.<init>(ConnectionString.java…
11:17:05 AM web.1 |     at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:176…
11:17:05 AM web.1 |     at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:158…
11:17:05 AM web.1 |     at Main.main(Main.java:28)

来自original version到我当前的版本,我确实尝试了很多,我只是想让它可以在 Heroku 上运行,以另一种方式学习这个项目。

当我学习另一个教程时,下面的代码是可以的,但我不知道为什么它在这个项目中不起作用。

MongoURI mongoURI = new MongoURI(System.getenv("MONGOHQ_URL"));
//get connected
DB db = mongoURI.connectDB();
mongoURI.getPassword());
MongoCredential credential = MongoCredential.createCredential(mongoURI.getUsername(), mongoURI.getDatabase(), mongoURI.getPassword());
MongoClient mongoClient = new MongoClient(new ServerAddress(), Arrays.asList(credential));

我还在 github 上提出了一个问题以及 jira

请帮我解决这个问题。提前致谢。

最佳答案

我尝试了40多个小时,终于成功了。

我改变了很多。以下是我认为重要的一些内容:

首先,我似乎无法使用 DB db = mongoURI.connectDB();,可能是因为 3.2.2 java-driver 版本 或因为 < Heroku 上的 MongoDB 版本。当我使用“MongoDatabase”而不是“DB”时,一些错误消失了,但仍然无法运行该项目。因为我必须在项目中使用“DB”的地方进行很多更改,并且从 DB 更改为 MongoDatabase 非常困难。

我意识到我可以在2.7.2中使用DB,因此我更改了与mongo-java-driver相关的所有语法版本。但同样,错误消失了,我无法运行该项目。不过,此时,似乎大部分错误都消失了。另一个错误表明另一个进程正在同一端口上运行。我杀掉了那个进程。现在所有错误都消失了。当我运行它时,我无法在 Heroku 上打开它,而是在端口 4567 上打开它。这很奇怪,因为 Heroku 的默认端口是 5000,而 4567 是 Jetty 的默认端口,Jetty 是 Java 应用程序的嵌入式服务器。我添加了这段代码,终于成功了。

port(Integer.valueOf(System.getenv("PORT")));

感谢我的教授,感谢所有帮助过我的人。

关于java - 无法在 Heroku 上使用 Java 驱动程序连接 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36223371/

相关文章:

java - 完成交换整数数组的前半部分和后半部分的方法

java - Tapestry5 - 将 bean 属性压缩到一个网格单元中

java - 为什么单击图像后我的应用程序崩溃

javascript - 为什么填充值数组后变成空?

php - 有效地计算 MongoDB 中出现的百分比

eclipse - Maven 没有找到 Scala 测试

java - 单连接中的多条语句

mongodb - iptables 阻止与 mongodb 的本地连接

android - 如果项目已经上传到 bintray 并与 jcenter 同步,如何更改 groupid?

java - 触摸文件的 Maven 目标/插件