2017-04-06 51 views
0

我正在嘗試根據本指南https://firebase.google.com/docs/database/server/start並使用Play Framework + Scala在Firebase上編寫一些數據。Firebase Java SDK不會保留數據,也不會觸發回調。任務似乎從未完成

調用DatabaseReference.setValue後沒有任何反應:數據未保留在Firebase上,我的回調未觸發。

下面的代碼:

lazy val conf = ConfigFactory.load() 

    lazy val options = new FirebaseOptions.Builder() 
             .setCredential(FirebaseCredentials.fromCertificate(new FileInputStream(conf.getString("firebase.credentials.path")))) 
             .setDatabaseUrl("https://orsz-xxxxx-xxxxx.firebaseio.com/") 
             .build() 

    lazy val propsDB = FirebaseDatabase.getInstance().getReference() 

    /** Initialize block to instantiates FirebaseApp **/ 
    { 
    println("[FirebasePersistence] - Initialize FirebaseApp") 
    FirebaseApp.initializeApp(options) 
    FirebaseDatabase.getInstance().setLogLevel(Logger.Level.DEBUG) 
    println("[FirebasePersistence] - Initialize FirebaseApp Done!") 
    } 

    def persistProposition(prop: Proposition): Future[Proposition] = Future { 
    val task = propsDB.setValue(1, new DatabaseReference.CompletionListener() { 
     override def onComplete(databaseError: DatabaseError, databaseReference: DatabaseReference) { 
     if (databaseError != null) { 
      println("Error: " + databaseError.getMessage) 
     } else { 
      println("[FirebasePersistence.persistProposition] - OK") 
     } 
     } 
    }) 
    prop 
    } 

我可以看到,測試SBT控制檯上,上的setValue生成的任務無法完成,即使秒後:

scala> task.isComplete 
res6: Boolean = false 

與火力地堡日誌級別DEBUG我執行得到這個日誌:

Thu Apr 06 08:53:37 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Trying to fetch auth token 
Thu Apr 06 08:53:37 BRT 2017 [DEBUG] RepoOperation: set:/
Thu Apr 06 08:53:37 BRT 2017 [DEBUG] DataOperation: set:/1 
Thu Apr 06 08:53:37 BRT 2017 [DEBUG] RepoOperation: Aborting transactions for path: /. Affected:/
Thu Apr 06 08:53:38 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Successfully fetched token, opening connection 
Thu Apr 06 08:53:38 BRT 2017 [DEBUG] Connection: conn_0 - Opening a connection 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - websocket opened 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - ws message: {"t":"c","d":{"t":"h","d":{"ts":1491479619239,"v":"5","h":"s-usc1c-nss-135.firebaseio.com","s":"bxE2HQCxtNNs4EznaO5xjWsInnIpu5Fi"}}} 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44991 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - HandleNewFrameCount: 1 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - handleIncomingFrame complete frame: {t=c, d={t=h, d={h=s-usc1c-nss-135.firebaseio.com, s=bxE2HQCxtNNs4EznaO5xjWsInnIpu5Fi, v=5, ts=1491479619239}}} 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - Got control message: {t=h, d={h=s-usc1c-nss-135.firebaseio.com, s=bxE2HQCxtNNs4EznaO5xjWsInnIpu5Fi, v=5, ts=1491479619239}} 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - realtime connection established 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - onReady 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - handling timestamp 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Sending first connection stats 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - Sending data: {t=d, d={a=s, r=0, b={c={sdk.java.3-0-0=1}}}} 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44993 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - calling restore state 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Restoring auth. 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - Sending data (contents hidden) 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44996 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - ws message: {"t":"d","d":{"r":0,"b":{"s":"ok","d":""}}} 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 44836 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - HandleNewFrameCount: 1 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=0, b={d=, s=ok}}} 
Thu Apr 06 08:53:39 BRT 2017 [DEBUG] Connection: conn_0 - received data message: {r=0, b={d=, s=ok}} 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - ws message: {"t":"d","d":{"r":1,"b":{"s":"permission_denied","d":"Access denied."}}} 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - Reset keepAlive. Remaining: 43628 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - HandleNewFrameCount: 1 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - handleIncomingFrame complete frame: {t=d, d={r=1, b={d=Access denied., s=permission_denied}}} 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] Connection: conn_0 - received data message: {r=1, b={d=Access denied., s=permission_denied}} 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Authentication failed: permission_denied (Access denied.) 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] Connection: conn_0 - closing realtime connection 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] WebSocket: ws_0 - websocket is being closed 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Got on disconnect due to OTHER 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Scheduling connection attempt 
Thu Apr 06 08:53:40 BRT 2017 [DEBUG] ConnectionRetryHelper: Scheduling retry in 821ms 
Thu Apr 06 08:53:41 BRT 2017 [DEBUG] WebSocket: ws_0 - closed 
Thu Apr 06 08:53:41 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Trying to fetch auth token 
Thu Apr 06 08:53:41 BRT 2017 [DEBUG] PersistentConnection: pc_0 - Successfully fetched token, opening connection 

我可以看到一些權限拒絕日誌,但可以'弄清楚爲什麼。

我已經在FileInputStream上測試憑據,它是可以的。

在火力地堡項目的權限:

{ 
    "rules": { 
    ".read": "true", 
    ".write": "true" 
    } 
} 

我已經測試使用火力管理員-4.1.6和火力服務器-SDK-3.0.1,並有同樣的結果

編輯: 我在調用setValue之前打印了FirebaseApp,FirebaseDatabase和DatabaseReference對象,並獲得了上面的代碼。 我如何確保admin sdk被正確初始化?

FirebaseApp=FirebaseApp{name=[DEFAULT], options=FirebaseOptions{databaseUrl=https://orsz-xxxxx-xxxxx.firebaseio.com/, credent[email protected]558b77e8, databaseAuthVariableOverride={}}} 
FirebaseApp.name=[DEFAULT] 

FirebaseDatabase.getInstance()[email protected] 

DatabaseReference=https://orsz-xxxxx-xxxxx.firebaseio.com/12345 
+0

看到我下面的後續。不是一個真正的答案,但太長的評論。 –

回答

0

我剛剛測試了一個新項目和Admin SDK版本4.1.6。

有了這個Java代碼:

final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference ref = database.getReference("43256111"); 
ref.setValue(1, new DatabaseReference.CompletionListener() { 
    @Override 
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
     if (databaseError != null) { 
      System.err.println(databaseError); 
     } else { 
      System.out.println("Written"); 
     } 
    } 
}); 

43256111是我的數據庫,我用於測試的位置。

我得到這個幾秒鐘後:

書面

規則沒有即使在這種情況下無所謂,因爲管理員SDK具有管理權限運行,甚至繞過這些規則對我來說:

"43256111": { 
    ".write": false 
} 

所以我不知道發生了什麼事,你的情況,但我不能複製。你確定你有管理SDK初始化正確嗎?

+0

我編輯我的問題,並提供了一些關於「我如何確保admin sdk被正確初始化的信息?」 –