Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在应用程序引擎标准Java中初始化Firebase管理_Java_Google App Engine_Firebase Admin - Fatal编程技术网

在应用程序引擎标准Java中初始化Firebase管理

在应用程序引擎标准Java中初始化Firebase管理,java,google-app-engine,firebase-admin,Java,Google App Engine,Firebase Admin,我正在尝试使用Firebase Auth in-App engine标准Java验证来自Android的令牌 但是,当我尝试初始化Firebase admin时,会出现异常 例外情况如下: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState (ZLjava/lang/String;Ljava/lang/Object;)V at com.google.firebase.FirebaseApp.c

我正在尝试使用Firebase Auth in-App engine标准Java验证来自Android的令牌

但是,当我尝试初始化Firebase admin时,会出现异常

例外情况如下:

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)
代码如下:

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);

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


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

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

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

对此异常的回答是“您必须仅初始化firebase sdk一次”,或者您需要在初始化过程中提供唯一的应用程序名称

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

答案是使用ServletContextListener

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

在web.xml文件中注册ServletContextListener

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

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

您需要检查依赖关系树,并找出冲突的Guava版本来自何处。AdminSDK使用Guava 20.0。
<listener>
  <listener-class>com.company.MyListener</listener-class>
</listener>
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.
  }
}