我按照以下指南部署了Google的移动后端启动器: https://developers.google.com/cloud/samples/mbs/deploy_backend
我在这些步骤上与客户端进行了测试,运行正常。
现在,我从
下载了客户端https://github.com/bradabrams/GeekSerendipity-io13
并按照
中的步骤操作直到第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)
为什么我会收到此异常?
我检查过的事情:
Consts.java中的项目ID和项目编号是正确的。
我已检查Android Manifest,看我的Maps API密钥是否正确
在代码控制台中为Maps API Key指定的包名称是正确的: ; com.turbomanage.sample.geekwatch
Appengine后端自行运行正常。以下是API资源管理器链接:
验证设置为“OPEN”,因此不会因任何原因而被屏蔽。
因为我针对https://developers.google.com/cloud/samples/mbs/android/中提到的Android示例应用测试了后端。 看起来后端运行正常。 最有可能的是,这看起来像Geek Serendipity客户端传递错误参数的情况。
在Eclipse中,我检查了代码以了解CloudQuery和QueryDto的外观,以及它的外观:
CloudQuery:
CloudQuery (Geek/PAST): filter: F: op: EQ, values: [name, null]
QueryDto:
{filterDto={operator=EQ, values=[name, null]}, kindName=Geek, limit=1, regId=APA91bHtELzN0oF2ZtUa91epD7gzxtM8R7EUP7O7w_9ebCxT7bEFbWO9CEhmkulOayXkJ8zRz1eXehfh-ZD4Mru0bug7nbnolrDdzOlbN5orsixKUyyZtMyHOy7MHNfA46gFQEWfvo9FQdCe8fsZ1qlumuyybSgQJw, scope=PAST, sortAscending=false, sortedPropertyName=name}
我怀疑这里的问题是值:[name,null]。但我无法破译得更远。这个查询应该是什么样的?
根据应用说明,我们可能会尝试在此查询所有可用的“极客”实例,以便在地图上显示,但由于我不知道Google提供的示例代码,我不确定是否是案子。 (我也是EndPoints的新手,这也是我尝试Geek Serendipity应用程序作为首发的原因)
此外,到目前为止,我们的数据存储区目前有0个“Geek”类型的实例。
我真的很感激任何可以帮助我继续调试的指针。
更新 我在API资源管理器中尝试了相同的查询。它返回HTTP 200 OK,但我仍然在AppEngine日志上看到异常。
事实上,即使我从查询中删除{filterDto = {operator = EQ,values = [name,null]},日志中的错误也会显示出来。
我开始怀疑这是一个无关紧要的错误,我不必担心。我将继续执行剩下的步骤,看看我是否遇到其他麻烦。
答案 0 :(得分: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客户端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”时,请确保在云控制台中“注册应用程序”两次:
对于第一个,请选择平台“Android”。这将需要您的包名。
对于第二个,选择Platform“Web”。这将为您提供Web客户端ID,但您也需要它来安装Android应用程序。 (Consts.java文件需要您的“Web客户端ID”,而不是您的“Android客户端ID”。另一方面,您的MBS身份验证页面需要您的Android客户端ID和Web客户端ID才能成功通过您的身份验证。 Android应用)