我最近将Google Cloud Endpoints服务器从Firebase Admin 4.1.2升级到了6.2.0。但是,升级后,服务器似乎无法以升级前的方式访问我的Firebase Realtime数据库。
除了我在其中指定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文件中的服务帐户密钥不会有任何问题,否则旧版本的服务器也会遇到相同的问题。有人遇到过这种问题吗?关于问题根源的任何理论?
更新:我尝试使用初始化块,看看如果我注释掉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);
但是什么都没写。
答案 0 :(得分:2)
通过消除过程,我最终设法将问题的源头一直跟踪到我的appengine-web.xml
文件中。该文件包含一行,需要更改该行才能使升级后的服务器正常工作:
之前:<url-stream-handler>urlfetch</url-stream-handler>
之后:<url-stream-handler>native</url-stream-handler>
如果有人遇到类似的问题,我希望这可能会有用。