【发布时间】:2018-07-06 20:46:06
【问题描述】:
我最近将我的 Google Cloud Endpoints 服务器从 Firebase Admin 4.1.2 升级到了 6.2.0。但是,升级后,服务器似乎无法像升级前那样访问我的 Firebase 实时数据库。
除了我指定 Firebase Admin 6.2.0 而不是 4.1.2 的 Gradle 文件之外,我唯一更改的代码在此初始化块中:
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文件中的service account key不能有什么问题,不然老版本的服务器也会出现同样的问题。有没有人遇到过这种问题?关于问题根源的任何理论?
更新:我尝试过使用初始化块,看看如果我注释掉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);
然而,什么都没有写出来。
【问题讨论】:
-
据我所知,
initializeApp方法不再接受参数。升级时,您是否按照他们的指南进行了重大更改? -
感谢您的评论,但
FirebaseApp.initializeApp(options)似乎是正确的,如此处的代码 sn-p 所示:(firebase.google.com/docs/admin/setup) -
哦,我以为您使用的是 1.0 版本的 SDK。从这里得到我的信息:(firebase.google.com/docs/functions/beta-v1-diff)
-
澄清一下:我的问题涉及用 Java 代码编写的 Google Cloud Endpoints 服务器;这不是 Firebase Cloud Functions JS 代码。
标签: firebase firebase-realtime-database firebase-admin google-cloud-endpoints-v2