我正在Heroku上使用Java和MongoDB构建一个Web应用程序。我从here学到了这个项目。我一直在尝试两天。
我使用3.2.2 mongo-java-driver
和3.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));
上打开了一个问题
请帮我解决这个问题。提前谢谢。
答案 0 :(得分:2)
我尝试了40多个小时,终于让它运转了。
我改变了很多。以下是我认为重要的事情:
首先,我似乎无法使用DB db = mongoURI.connectDB();
,可能是因为 3.2.2 java驱动程序版本,或者因为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")));
感谢我的教授并感谢所有帮助过我的人。