首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在Heroku上使用Java驱动程序连接MongoDB

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

Stack Overflow用户
提问于 2016-03-25 15:57:37
回答 1查看 1.3K关注 0票数 1

我正在使用Java和MongoDB在Heroku上构建一个web应用程序。我从这里那里学到了这个项目。我已经试了两天了。

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

这是在我的Main类中:

代码语言:javascript
复制
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();
}

我得到了一个错误:

代码语言:javascript
复制
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,所以我尝试用mongodb://user:passwd@host1:port1,host2:port2/dbname代替MONGOHQ_URL,我也尝试在Heroku上使用mLab MongoDB,但是同样的错误:

代码语言:javascript
复制
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)

原版到我现在的版本,我真的尝试了很多,我只想让它在Heroku上运行,以另一种方式学习这个项目。

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

代码语言:javascript
复制
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));

我还在githubjira上发表了一篇文章

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 15:21:09

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

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

首先,我似乎不能使用DB db = mongoURI.connectDB();,可能是因为3.2.2 java驱动程序版本,或者是因为Heroku上的MongoDB版本。当我使用"MongoDatabase“而不是"DB”时,中的一些错误消失了,但仍然无法运行该项目。因为无论在哪里使用"DB",我都必须在我的项目中进行大量的更改,这很难从DB更改为MongoDatabase

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

代码语言:javascript
复制
port(Integer.valueOf(System.getenv("PORT")));

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36223371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档