2016-06-13 122 views
3

我遇到了與Firebase和Java EE相關的問題。Java EE FirebaseApp名稱[DEFAULT]已存在

我目前正在爲我的項目編寫一些Java servlet,並且我第一次使用Firebase是因爲我想嘗試新的東西。

我的實際問題如下: 我有一個servlet負責在用戶數據庫中交換iOS設備令牌。這對於將遠程推送通知發送到設備是必需的。 我做這個像谷歌的教程,但我發現以下異常:

java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists! 

我訪問火力地堡數據庫的方式是通過Java SDK。

我做這個用下面的代碼:

連接方法

// gets called by the servlet to configure Firebase 
    public static void connect() { 
     try { 
     // for authentication purpose 
     Map<String, Object> auth = new HashMap<>(); 
     auth.put("uid", "my-service-account"); 

     // Setting up the FirebaseOptions object 
     // constant FIREBASE_DATABASE_URL = "url to my database" 
     // constant FIREBASE_KEY_PATH = "path to my json key" 
     options = new FirebaseOptions.Builder() 
        .setDatabaseUrl(FIREBASE_DATABASE_URL) 
        .setServiceAccount(new FileInputStream(FIREBASE_KEY_PATH)) 
        .setDatabaseAuthVariableOverride(auth) 
        .build(); 

     FirebaseApp.initializeApp(options); 

     // calling the method for exchanging the token 
     exchangeIosDeviceToken("[email protected]", "5bf53173c9ef0a37638f3ddaa59cf2c0687c14ca0dcd47ccf57f9f09bd6368ab"); 
     } catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
     } 
    } 

exchangeIosDeviceToken方法

public static boolean exchangeIosDeviceToken(String email, String newDeviceToken) { 
     FirebaseDatabase database = FirebaseDatabase.getInstance(); 

     // getting a reference to my "employee" child 
     DatabaseReference employeeReference = database.getReference("/employee"); 

     Map<String, Object> employeeUpdates = new HashMap<>(); 
     // updating the device token with child "iosDeviceToken" of "employee" 
     employeeUpdates.put(email+"/iosDeviceToken", newDeviceToken); 

     // update the actual children 
     employeeReference.updateChildren(employeeUpdates); 
     return true; 
    } 

有趣的是,當我試圖執行此代碼在一個獨立的主類(替換連接方法,與馬在方法中),代碼正在工作。

在你說「有很多與這個主題相關的問題」之類的東西之前......他們幾乎都與Android相關,並且與我的問題相關的問題很少得到答案。

Regards

回答

6

解決了這個問題。

問題是: 每次請求傳入時我都調用connect方法。

解決方案: 只調用connect方法一次。 (的ServletContextListener)

0

我修復這個問題是通話FirebaseApp.getInstance().delete();

+1

.delete()似乎不存在運行版本11.0.1 –

0

這對於未來的用戶,您可以檢查默認應用程序是否初始化或不喜歡這樣。

FirebaseApp firebaseApp = null; 
    List<FirebaseApp> firebaseApps = FirebaseApp.getApps(); 
    if(firebaseApps!=null && !firebaseApps.isEmpty()){ 
     for(FirebaseApp app : firebaseApps){ 
      if(app.getName().equals(FirebaseApp.DEFAULT_APP_NAME)) 
       firebaseApp = app; 
     } 
    } 
    else 
     firebaseApp = FirebaseApp.initializeApp(options);