我正在尝试通过管理SDK从Java端点访问firebase实时数据库。身份验证似乎成功,但查询无效。不会发生错误,也不会调用侦听器。 Firebase规则设置为可写(使用模拟器确保)。
Firebase db:
mydbid
+---users
+---user0
+---email:default@gmail.com
端点def:
@Api(
name = "firebaseTestEndpoint",
version = "v1",
description = "Firebase admin test endpoint.")
public class FirebaseTestService {
private static final Logger log =
Logger.getLogger(FirebaseTestService.class.getName());
static {
log.setLevel(Level.INFO);
}
@ApiMethod(httpMethod = HttpMethod.POST)
public void connectToFirebase(@Named("id") String id,
ServletContext servletContext) {
Map<String, Object> authVars = new HashMap<String, Object>();
authVars.put("uid", "admin");
try {
FirebaseOptions options = new FirebaseOptions.Builder()
.setDatabaseUrl("https://mydbid.firebaseio.com")
.setCredential(FirebaseCredentials.fromCertificate(
servletContext.getResourceAsStream(
"/WEB-INF/firebase-credentials.json")))
.setDatabaseAuthVariableOverride(authVars)
.build();
FirebaseApp app = FirebaseApp.initializeApp(options);
DatabaseReference ref =
FirebaseDatabase.getInstance().getReference("/users/user0/email");
ValueEventListener valueEventListener =
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot arg0) {
log.info(arg0.getRef().getPath().toString() +
" changed to " + arg0.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError arg0) {
log.info("cancelled");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@ApiMethod(httpMethod = HttpMethod.POST)
public void updateEmail(@Named("id") String id) {
Map<String,Object> values = new HashMap<String,Object>();
values.put("email", "updated@gmail.com");
try {
FirebaseDatabase.getInstance().getReference("/users/user0")
.updateChildren(values, new DatabaseReference.CompletionListener() {
public void onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if (databaseError != null) {
throw databaseError.toException();
}
log.info("update completed.");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
appengine-web.xml(相关部分):
<basic-scaling>
<max-instances>2</max-instances>
</basic-scaling>
web.xml(相关部分; *之前插入的空格):
<servlet>
<servlet-name>EndpointsServlet</servlet-name>
<servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value>mypackage.FirebaseTestService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>EndpointsServlet</servlet-name>
<url-pattern>/_ah/api/ *</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SystemServiceServlet</servlet-name>
<servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value>mypackage.FirebaseTestService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SystemServiceServlet</servlet-name>
<url-pattern>/_ah/spi/ *</url-pattern>
</servlet-mapping>
在API Explorer中测试,connectToFirebase()调用之后是对_ah / background的请求,但updateEmail()没有。 怎么了?
答案 0 :(得分:0)
为了能够在AppEngine上使用firebase侦听器,请将基本缩放更改为手动缩放。
<manual-scaling>
<instances>1</instances>
</manual-scaling>
如果要使用AppEngine实例的基本或自动缩放,请将firebase侦听器更改为REST调用。