0

我按照以下指南部署了 Google 的移动后端启动器: https ://developers.google.com/cloud/samples/mbs/deploy_backend

我在这些步骤上与客户一起对其进行了测试,并且运行良好。

现在,我从

https://github.com/bradabrams/GeekSerendipity-io13

并按照以下步骤操作

http://bradabrams.com/2013/05/google-io-2013-session-overview-from-nothing-to-nirvana-in-minutes-cloud-backend-for-your-android-application-building-geek-机缘巧合/

直到第 3 步。到目前为止,我可以看到一张地图,它在地图上正确显示了我的位置。但是,当我查看 AppEngine 日志时,我看到以下异常:

com.google.api.server.spi.SystemService invokeServiceMethod: cause={0} java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at com.google.cloud.backend.beans.FilterDto.getOperand(FilterDto.java:131)
    at com.google.cloud.backend.beans.FilterDto.getDatastoreFilter(FilterDto.java:99)
    at com.google.cloud.backend.spi.QueryOperations.executeQuery(QueryOperations.java:109)
    at com.google.cloud.backend.spi.QueryOperations.list(QueryOperations.java:84)
    at com.google.cloud.backend.spi.EndpointV1.list(EndpointV1.java:227)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:45)
    at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:339)
    at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:163)
    at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:121)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    at java.lang.Thread.run(Thread.java:722)

为什么我会收到此异常?

我检查过的事情:

  1. Consts.java 中的项目 ID 和项目编号是正确的。

  2. 我检查了 Android Manifest 以查看我的 Maps API 密钥是否正确

  3. 在代码控制台中为 Maps API Key 指定的包名称正确:;com.turbomanage.sample.geekwatch

  4. Appengine 后端本身运行良好。这是 API 资源管理器链接:

    http://forward-alchemy-355.appspot.com/_ah/api/explorer

  5. 身份验证设置为“OPEN”,因此不应因任何原因被阻止。

  6. 由于我已经针对https://developers.google.com/cloud/samples/mbs/android/中提到的 Android 示例应用程序测试了后端。看起来后端运行良好。很可能,这看起来像是 Geek Serendipity 客户端传递错误参数的情况。

  7. 在 Eclipse 中,我检查了代码以查看 CloudQuery 和 QueryDto 的外观,下面是它的外观:

云查询:

CloudQuery (Geek/PAST): filter: F: op: EQ, values: [name, null]

查询Dto:

{filterDto={operator=EQ, values=[name, null]}, kindName=Geek, limit=1, regId=APA91bHtELzN0oF2ZtUa91epD7gzxtM8R7EUP7O7w_9ebCxT7bEFbWO9CEhmkulOayXkJ8zRz1eXehfh-ZD4Mru0bug7nbnolrDdzOlbN5orsixKUyyZtMyHOy7MHNfA46gFQEWfvo9FQdCe8fsZ1qlumuyybSgQJw, scope=PAST, sortAscending=false, sortedPropertyName=name}

我怀疑这里的问题是值:[name,null]。但我无法进一步解读。这个查询应该是什么样子?

根据应用程序描述,我们可能正在尝试在此处查询所有可用的“Geek”实例,以显示在地图上,但由于我不熟悉 Google 提供的此示例代码,因此我不确定是否是这种情况。(我也是 EndPoints 的新手,这就是我尝试 Geek Serendipity 应用程序作为初学者的原因)

此外,到目前为止,我们的数据存储区有 0 个“极客”类型的实例。

我真的很感激任何可以帮助我继续调试的指针。

更新: 我尝试了来自 API Explorer 的相同查询。它返回 HTTP 200 OK,但我仍然在 AppEngine 日志中看到异常。

https://apis-explorer.appspot.com/apis-explorer/?base=https%3A%2F%2Fforward-alchemy-355.appspot.com%2F_ah%2Fapi#p/mobilebackend/v1/mobilebackend.endpointV1.list ?_h=2&resource=%257B%250A++%2522filterDto%2522%253A+%250A++%257B%250A++++%2522operator%2522%253A+%2522EQ%2522%252C%250A++name++%2522values%2522%253A+%522%253A+%522%52++2%2 252C%2522null%2522%250A++++%255D%250A++%257D%252C%250A++%2522kindName%2522%253A+%2522Geek%2522%252C%250A++%2522regId%2522%253A+%2522APA91bHtELzN0oF2ZtUa91epD7gzxtM8R7EUP7O7w_9ebCxT7bEFbWO9CEhmkulOayXkJ8zRz1eXehfh-ZD4Mru0bug7nbnolrDdzOlbN5orsixKUyyZtMyHOy7MHNfA46gFQEWfvo9FQdCe8fsZ1qlumuyybSgQJw%2522%252C%250A++%2522scope% 2522%253A+%2522PAST%2522%252C%250A++%2522sortAscending%2522%253A+false%252C%250A++%2522sortedPropertyName%2522%253A+%2522name%2522%250A%257D&

事实上,即使我从查询中删除 {filterDto={operator=EQ, values=[name, null]} ,日志中的错误也会出现。

我开始怀疑这是否是我不必要担心的无害错误。我将继续执行剩余的步骤,看看是否遇到任何其他问题。

4

1 回答 1

1

如果您使用的是 Geek Serendipity Android 客户端代码的源代码,请不要在每一步都停下来检查应用程序是否正常工作。

在您完成身份验证设置之前,它不会起作用!它就是这样设计的。这是最终产品。

更多解释如下:

在上面的错误中,我在 JSON 查询中提到了以下内容:

operator=EQ, values=[name, null]

这是生成此查询的代码:

getCloudBackend().listByProperty("Geek", "name", Op.EQ,
                                        accountName, null, 1, Scope.PAST,
                                        new CloudCallbackHandler<List<CloudEntity>>() {...

换句话说,它应该翻译成如下内容:

operator=EQ, values=[name, "somefunkyuser@gmail.com"]

但是,它没有,因为此时我还没有设置身份验证。换句话说,在 Consts.java 中,“IS_AUTH_ENABLED”应该是“true”,并且您还应该在那里生成并添加“Web Client ID”键,完全按照http://bradabrams.com/2013/05/上的指定google-io-2013-session-overview-from-nothing-to-nirvana-in-minutes-cloud-backend-for-your-android-application-building-geek-serendipity/

按照说明继续直到页面末尾。一旦你到达页面的末尾,如果你正确地遵循了,然后测试这个应用程序,它会工作的。

附加说明:

为 Android 应用程序生成“CLIENT ID”时,请确保在云控制台中“注册应用程序”两次:

  1. 对于第一个,选择平台“Android”。这将需要您的包名称。

  2. 对于第二个,选择平台“Web”。这将为您提供一个 Web 客户端 ID,但您的 Android 应用程序也需要它。(Consts.java 文件需要您的“Web 客户端 ID”,而不是“Android 客户端 ID”。另一方面,您的 MBS 身份验证页面需要您的 Android 客户端 ID 和 Web 客户端 ID 才能成功通过您的身份验证安卓应用)

于 2013-10-05T08:06:20.207 回答