2016-03-25 135 views
1

我在Heroku上使用Java和MongoDB構建Web應用程序。我從here瞭解到這個項目。我一直在嘗試兩天。在Heroku上無法使用Java驅動程序與MongoDB連接

我用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) 

這是空指針異常,所以我試圖通過更換MONGOHQ_URLmongodb://user:[email protected]:port1,host2:port2/dbname,我也嘗試使用mLab MongoDB在Heroku上,但同樣的錯誤:

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)); 

我也githubjira

請幫我解決這個問題開了一個問題。提前致謝。

+0

你能通過命令行連接到你的mongo數據庫嗎? – vincent

+0

@vincent是的,我可以通過命令行連接到mongolab,我可以通過命令行創建用戶並創建集合。 –

回答

2

我嘗試了超過40個小時,並最終得到它的工作。

我改變了很多。下面是一些我覺得是很重要的:

首先,看來我不能用DB db = mongoURI.connectDB();的也許是因爲3.2.2 Java的驅動程序版本或因在Heroku的MongoDB的版本。當我用「MongoDatabase」代替「DB」時,一些錯誤消失了,但仍然無法運行該項目。因爲在我的項目中,無論使用哪個「DB」,我都必須對其進行更改,並且這是很難從DB更改爲MongoDatabase

我意識到,我可以在2.7.2使用DB,所以我改變了所有相關蒙戈的Java驅動程序版本的語法。但是,錯誤消失了,我無法運行該項目。但是,在這個時候,似乎大多數錯誤都消失了。還有一個錯誤顯示另一個進程正在同一端口上運行。我殺了那個過程。現在所有的錯誤消失了當我運行它時,我無法在Heroku上打開它,但是在端口4567上。這很奇怪,因爲Heroku的默認端口是5000,並且4567是Jetty的默認端口,Jetty是用於Java應用程序的嵌入式服務器。我添加了這段代碼,並最終奏效了。

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

感謝我的教授,並感謝所有幫助過我的人。

相關問題