Прямо сейчас ваш код пытается инициализировать FirebaseApp
для каждого запроса. Это не нужно и фактически запрещено (как показано в сообщении об ошибке). Самое простое решение - проверить, инициализирована ли FirebaseApp
с помощью:
if (FirebaseApp.getApps().isEmpty()) {
String DATABASE_URL = "https://name.firebaseio.com/";
try {
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("token.json");
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials( GoogleCredentials.fromStream(inputStream))
.setDatabaseUrl(DATABASE_URL)
.build();
FirebaseApp.initializeApp(options);
} catch (IOException e) {
e.printStackTrace();
System.out.println("Error loading database");
}
}
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
return service.getAll();
Но это все равно проверяет FirebaseApp
каждый вызов и, честно говоря, просто делает код этого метода больше, чем нужно. Так что, вероятно, лучше привязаться к жизненному циклу контроллера и запускать код, который инициализирует FirebaseApp
только при создании контроллера. Я не достаточно осведомлен о Spring, чтобы ответить, как это сделать, но эта статья показывает некоторые многообещающие подходы.