来自Java端点的Firebase管理员

时间:2017-05-01 08:05:06

标签: java firebase firebase-realtime-database google-cloud-endpoints firebase-admin

我正在尝试通过管理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()没有。  怎么了?

1 个答案:

答案 0 :(得分:0)

为了能够在AppEngine上使用firebase侦听器,请将基本缩放更改为手动缩放。

<manual-scaling>
   <instances>1</instances>
</manual-scaling>

如果要使用AppEngine实例的基本或自动缩放,请将firebase侦听器更改为REST调用。