我有一个 Appengine 连接的 Andorid 项目,用于在服务器和 Android 设备之间启用 RPC 调用。当我在 GWT 客户端上进行调用时,一切都运行良好,但是当我从 Android 应用程序进行调用时,服务器会抛出此 nullpointer 异常。我正在使用 Requestfactory 进行 RPC 调用。 GAE 版 1.5.2
[ERROR] Unexpected error
java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
at com.google.web.bindery.requestfactory.server.ServiceLayerCache.getOrCache(ServiceLayerCache.java:225)
at com.google.web.bindery.requestfactory.server.ServiceLayerCache.resolveRequestFactory(ServiceLayerCache.java:198)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:203)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:127)
at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
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 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
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 com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
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.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
问题是堆栈跟踪不提供有关代码中某些问题的任何信息。
我想要做的是从 Android 客户端向 AppEngine 服务器发送异常。这就是 android 端代码。
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
MyRequestFactory factory = (MyRequestFactory) Util
.getRequestFactory(context,
MyRequestFactory.class);
ExceptionRequest request = factory.exceptionRequest();
ExceptionProxy ep = request.create(ExceptionProxy.class);
ep.setClassName(aThrowable.getClass().getSimpleName());
ep.setRevision(1);
ep.setVersionName("2.1.2");
ep.setStack("");
request.updateException(ep).fire();
return null;
}
}.execute();
并抛出此异常(内部服务器错误)
09-05 22:29:36.104: ERROR/AndroidRuntime(602): Caused by: java.lang.RuntimeException: Internal Server Error
09-05 22:29:36.104: ERROR/AndroidRuntime(602): at com.google.web.bindery.requestfactory.shared.Receiver.onFailure(Receiver.java:44)
09-05 22:29:36.104: ERROR/AndroidRuntime(602): at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.fail(AbstractRequestContext.java:677)
09-05 22:29:36.104: ERROR/AndroidRuntime(602): ... 13 more
在 Web 客户端上执行 RPC 工作完美,但在 Android 上我无法使其工作。
3 回答
这是因为 GAE 的版本。将其更新为 1.6.1.
我遇到了这个,不小心(我想)找到了答案。创建一个新的 AppEngine 应用程序(不是一个新的 App Engine Connected Android 项目,但实际上是 appengine.google.com),并尝试在新创建的应用程序上测试它。我认为他们对 AppEngine 做了一些更改,你需要一个新的才能正确使用 App Engine Connected Android Project。
祝你好运!
为了让 Android 应用程序使用谷歌应用程序引擎,您必须在 Eclipse 中创建 App Engine 连接的 Android 项目,默认情况下配置为 GWT 2.3.0:
Windows -> Preferences -> Google -> Web Toolkit
(而不是 2.4.0rc1)如果您在创建项目后尝试将 GWT 版本从
2.4.0rc1
更改为2.3.0
,则您将始终在 Android 应用程序中出现此错误(Web 应用程序将起作用)。