当前位置: 首页 > 知识库问答 >
问题:

Java EE FirebaseApp名称[默认值]已存在

姜德容
2023-03-14

我遇到了一个与Firebase和JavaEE有关的问题。

我目前正在为我的项目编写一些Java servlet,我第一次使用Firebase是因为我想尝试一些新的东西。

我的实际问题如下:我得到了一个servlet,负责在用户数据库中交换iOS设备令牌。这是向设备发送远程推送通知所必需的。我在谷歌教程中也这样做过,但我得到了以下例外:

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

我访问Firebase数据库的方式是通过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("testmail@example.com", "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系统有关,与我的问题有关的问题很少得到回答。

当做

共有3个答案

岳风畔
2023-03-14

出现此异常是因为您试图再次创建[DEFAULT]FirebaseApp,只需在初始化之前添加验证以检查它是否存在,如下所示:

if(FirebaseApp.getInstance(FirebaseApp.DEFAULT_APP_NAME) != null) {
    return;
}
费朗
2023-03-14

这对于未来的用户来说,你可以检查默认应用是否像这样初始化。

    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);   
吕飞翼
2023-03-14

解决了问题。

问题是:每次收到请求时,我都会调用connect方法。

解决方案:只调用connect方法一次。(ServletContextListener)

 类似资料:
  • 问题内容: 有没有一种方法可以在python ElementTree中定义默认/无前缀的命名空间?这似乎不起作用… 这也不是: 可以,但是我必须在每个元素前加上前缀: 在OSX上使用Python 3.5。 编辑:如果答案为“否”,您仍然可以获得赏金:-)。我只是想要一个花了很多时间使用它的人的明确“否”。 问题答案: 没有简单的方法可以透明地处理默认名称空间。正如您已经提到的,为空名称空间分配非空

  • 我正在尝试使用mongoengine(0.6.0)驱动程序将mongo(V4.0.3)db与django(V1.11)连接起来。它显示连接不存在。 回溯(最近调用的最后一次): 文件“manage.py”第22行,execute_from_command_line(sys.argv)文件“/usr/local/lib/python2.7/dist-packages/django/core/mana

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Default Values 一节 当消息被解析时, 如果被编码的消息没有包含特定的简单元素, 被解析的对象对应的字段被设置为默认值. 默认值是和类型有关的: 对于strings, 默认值是空字符串(注, 是"", 而不是null) 对于bytes, 默认值是空字节(注, 应该是byte[0], 注意这里也不是null)

  • 问题内容: 有什么方法可以使JAXB不保存其值是@Element批注中指定的默认值的字段,然后在从XML加载null或空值的元素时对其设置值?一个例子: 应生成: 而当加载 我正在尝试执行此操作,以生成干净的XML配置文件,并使其可读性更强且尺寸更小。 敬请谅解,谢谢。 问题答案: 您可以通过在get / set方法中使用逻辑并将逻辑放入其中来执行以下操作: 例 演示版 输出量 想要查询更多的信息

  • 问题内容: 我想使用JDOM读取XML文件,然后使用XPath从JDOM Document中提取数据。它可以很好地创建Document对象,但是当我使用XPath在Document中查询元素列表时,我什么也没得到。 我的XML文档在根元素中定义了一个默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行了XPath查询并返回了我想要的元素。要使XPath查询返回结果,我还必须做什么? XML:

  • 在启动并运行Emacs/Clojure环境时,我现在遇到了我不确定是否正常的行为。特别是,当我启动一个nREPL并编译(C-C-k)我的缓冲区时,我会被放到内核顶部定义的名称空间之外的其他地方。clj文件。我应该加上免责声明,我对Clojure和名称空间有点陌生,因此我对这一切的理解可能是模糊的。我愿意接受那些给我提供更好方法的固执己见的答案™. 首先,关于我的设置: 我的emacs环境是Coco