在App Engine标准Java中初始化Firebase Admin

问题描述 投票:3回答:2

我正在尝试在App引擎标准Java中使用Firebase Auth来验证来自Android的令牌。

但是,当我尝试初始化Firebase管理员时,我得到了一个例外。

这是例外:

java.lang.NoSuchMethodError: 
com.google.common.base.Preconditions.checkState
(ZLjava/lang/String;Ljava/lang/Object;)V
at com.google.firebase.FirebaseApp.checkNotDeleted (FirebaseApp.java:352)
at com.google.firebase.FirebaseApp.getOptions (FirebaseApp.java:267)
at com.google.firebase.FirebaseApp$TokenRefresher.<init> (FirebaseApp.java:434)
at com.google.firebase.FirebaseApp$TokenRefresher$Factory.create (FirebaseApp.java:535)
at com.google.firebase.FirebaseApp.<init> (FirebaseApp.java:113)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:201)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:188)
at com.google.firebase.FirebaseApp.initializeApp (FirebaseApp.java:175)

最有可能的是,由于Guava版本的冲突

这是我的傻瓜:

dependencies {
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.60'
    compile 'com.google.appengine.tools:appengine-gcs-client:0.7'
    compile ('com.google.firebase:firebase-admin:5.7.0') {
        exclude group: 'com.google.guava'
    }
    compile 'com.google.guava:guava:23.0'
    compile 'javax.servlet:servlet-api:2.5'
}

这是代码:

InputStream in = filterConfig.getServletContext()
            .getResourceAsStream("/WEB-INF/PRIVATE_KEY_JSON.json");

FirebaseOptions options = null;
try {
     options = new FirebaseOptions.Builder()
            .setCredentials(GoogleCredentials.fromStream(in))
            .build();
} catch (IOException e) {
    e.printStackTrace();
}
FirebaseApp.initializeApp(options);
java google-app-engine firebase-admin
2个回答
0
投票

解决方案是在链接中添加jar文件

https://github.com/firebase/firebase-admin-java/pull/125


0
投票

由于该问题与将firebase管理SDK初始化为app engine java环境有关,因此有可能遇到异常:

java.lang.IllegalStateException:名称为[DEFAULT]的FirebaseApp已存在。

如果您的所有依赖关系都是正确的,如上面的答案所述,那么您仍然可能会遇到此异常。

对例外的回答是“您必须仅初始化firebase sdk一次”,或者您需要在初始化期间提供唯一的应用名称。

现在在哪里放置只执行一次的初始化代码,以便在使用firebase资源之前,必须初始化sdk。

答案是使用ServletContextListener docs

如果您想在调用任何servlet之前运行自定义逻辑:

在web.xml文件中注册ServletContextListener。

<listener>
  <listener-class>com.company.MyListener</listener-class>
</listener>

在servlet和过滤器代码旁边提供一个类:

public class MyListener implements ServletContextListener {
  public void contextInitialized(ServletContextEvent event) {
    // This will be invoked as part of a warmup request, or
    // the first user request if no warmup request was invoked.
  }
  public void contextDestroyed(ServletContextEvent event) {
    // App Engine does not currently invoke this method.
  }
}

ServletContextListener在预热请求期间运行。如果没有预热请求,它将在第一次请求到新实例时运行。这可能会导致加载请求

© www.soinside.com 2019 - 2024. All rights reserved.