Проблема обновления Firebase Admin 6.2.0: сервер не может получить доступ к базе данных реального времени - PullRequest
0 голосов
/ 05 июля 2018

Я недавно обновил свой сервер конечных точек Google Cloud с Firebase Admin 4.1.2 до 6.2.0. Однако после обновления сервер, похоже, не может получить доступ к моей базе данных Firebase Realtime так же, как до обновления.

Единственный код, который я изменил, кроме файла Gradle, где я указываю Firebase Admin 6.2.0 вместо 4.1.2, находится в этом блоке инициализации:

static {

    FirebaseOptions options = null;
    FileInputStream serviceAccount =
            null;
    try {
        serviceAccount = new FileInputStream(new File("WEB-INF/path_to_file.json"));
        options = new FirebaseOptions.Builder()
                //.setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) OLD VERSION
                .setCredentials(GoogleCredentials.fromStream(serviceAccount)) // NEW VERSION
                .setDatabaseUrl(FIREBASE_NAME)
                .build();
        FirebaseApp.initializeApp(options);
    } catch (Exception e) {
        Log.warning(e.getMessage());
        e.printStackTrace();
    }
}

Единственная строка, которая здесь изменилась, это строка setCredentials().

Моя текущая гипотеза заключается в том, что проблема заключается в какой-то проблеме аутентификации. Но, по-видимому, не может быть ничего плохого в ключе учетной записи службы в файле json, иначе старая версия сервера также имела бы ту же проблему. Кто-нибудь сталкивался с такой проблемой раньше? Любые теории о том, что может быть источником проблемы?

ОБНОВЛЕНИЕ: я попытался поиграться с блоком инициализации, посмотреть, что произойдет, если я закомментирую строку setCredentials(), или введу неправильный путь к FileInputStream, или передам неправильный URL-адрес setDatabaseUrl(). Во всех этих случаях я регистрирую какую-то ошибку, которая указывает, что инициализация не удалась. Однако, с кодом, как указано выше, я не регистрирую ошибки. Так что проблема остается загадкой.

Тестовый код, который я использую для доступа к моей базе данных реального времени, очень прост:

    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference ref = database.getReferenceFromUrl(FIREBASE_NAME);

    Map<String, Object> testMap = new HashMap<String, Object>();
    testMap.put("test", "test");

    ref.child("server_test").updateChildrenAsync(testMap);

Однако ничего не пишется.

1 Ответ

0 голосов
/ 06 июля 2018

В процессе устранения мне в итоге удалось отследить источник проблемы до моего файла appengine-web.xml. Этот файл содержал одну строку, которую нужно было изменить для корректной работы обновленного сервера:

До: <url-stream-handler>urlfetch</url-stream-handler>

После: <url-stream-handler>native</url-stream-handler>

Если кто-то сталкивается с подобной проблемой, я надеюсь, что это может оказаться полезным.

...