1

我试图用它org.springframework.boot:spring-boot-devtools来加速开发。

我的项目使用 Firebase 来验证一些请求。Firebase 通过以下方式初始化:

@PostConstruct
public void instantiateFirebase() throws IOException {
    FirebaseOptions options = new FirebaseOptions.Builder()
            .setDatabaseUrl(String.format("https://%s.firebaseio.com", configuration.getFirebaseDatabase()))
            .setServiceAccount(serviceJson.getInputStream())
            .build();
    FirebaseApp.initializeApp(options);
}

在更改.class文件时重新加载上下文后 Spring 报告错误:

Caused by: java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists!
    at com.google.firebase.internal.Preconditions.checkState(Preconditions.java:173)
    at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:180)
    at com.google.firebase.FirebaseApp.initializeApp(FirebaseApp.java:160)

哪些 Firebase API 允许注销/销毁我应该在其中使用的 FirebaseApp @PreDestroy

4

1 回答 1

3

看起来无法禁用/关闭/重新初始化 Firebase 应用程序。

在我的情况下,将该实例保留在内存中而不进行更改是可以的。

根据您的要求,您可以简单地使用:

@PostConstruct
public void instantiateFirebase() throws IOException {
    // We use only FirebaseApp.DEFAULT_APP_NAME, so check is simple.
    if ( ! FirebaseApp.getApps().isEmpty())
        return;

    Resource serviceJson = applicationContext.getResource(String.format("classpath:firebase/%s", configuration.getFirebaseServiceJson()));

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setDatabaseUrl(String.format("https://%s.firebaseio.com", configuration.getFirebaseDatabase()))
            .setServiceAccount(serviceJson.getInputStream())
            .build();
    FirebaseApp.initializeApp(options);
}

或过滤数据,例如:

for (FirebaseApp app : FirebaseApp.getApps()) {
    if (app.getName().equals(FirebaseApp.DEFAULT_APP_NAME))
        return;
}
于 2017-07-09T10:48:56.580 回答