【问题标题】:Initializing Firebase Admin in App Engine standard Java在 App Engine 标准 Java 中初始化 Firebase Admin
【发布时间】:2017-12-31 21:34:32
【问题描述】:

我正在尝试在 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);

【问题讨论】:

  • 您将需要检查依赖关系树,并找出冲突的 Guava 版本来自何处。 Admin SDK 使用 Guava 20.0。

标签: java google-app-engine firebase-admin


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    由于问题与初始化firebase admin SDK到app engine java环境有关,所以有可能有人遇到了异常:

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

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

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

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

    Answer 正在使用 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 在预热请求期间运行。如果没有预热请求,它会在第一次请求新实例时运行。这可能会导致加载请求

    【讨论】:

      猜你喜欢
      • 2019-02-24
      • 2015-06-11
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多