【发布时间】:2012-02-12 23:29:13
【问题描述】:
我能够使用生成的示例代码运行 C2DM 示例。但是,当我尝试使用 Eclipse 向导实现自己的 RPC 时,出现了错误:
2012 年 1 月 17 日晚上 11:19:13 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator 死了 严重:没有 RequestContext 操作 MG19Dafmkcg_3$9lmRyrb_HKoK8= 2012 年 1 月 17 日晚上 11:19:13 com.google.web.bindery.requestfactory.server.RequestFactoryServlet doPost 严重:意外错误 com.google.web.bindery.requestfactory.server.UnexpectedException:没有请求上下文操作 MG19Dafmkcg_3$9lmRyrb_HKoK8= 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.die(ServiceLayerDecorator.java:216) 在 com.google.web.bindery.requestfactory.server.ResolverServiceLayer.resolveRequestContext(ResolverServiceLayer.java:154) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.resolveRequestContext(ServiceLayerDecorator.java:162) 在 com.google.web.bindery.requestfactory.server.FindServiceLayer.resolveRequestContext(FindServiceLayer.java:54) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.resolveRequestContext(ServiceLayerDecorator.java:162) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.resolveRequestContext(ServiceLayerDecorator.java:162) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:104) 在 com.google.web.bindery.requestfactory.server.ServiceLayerCache.getOrCache(ServiceLayerCache.java:233) 在 com.google.web.bindery.requestfactory.server.ServiceLayerCache.resolveRequestContext(ServiceLayerCache.java:187) 在 com.google.web.bindery.requestfactory.server.ResolverServiceLayer.resolveRequestContextMethod(ResolverServiceLayer.java:161) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.resolveRequestContextMethod(ServiceLayerDecorator.java:167) 在 com.google.web.bindery.requestfactory.server.FindServiceLayer.resolveRequestContextMethod(FindServiceLayer.java:70) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.resolveRequestContextMethod(ServiceLayerDecorator.java:167) 在 com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.resolveRequestContextMethod(ServiceLayerDecorator.java:167) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:104) 在 com.google.web.bindery.requestfactory.server.ServiceLayerCache.getOrCache(ServiceLayerCache.java:233) 在 com.google.web.bindery.requestfactory.server.ServiceLayerCache.resolveRequestContextMethod(ServiceLayerCache.java:193) 在 com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processInvocationMessages(SimpleRequestProcessor.java:434) 在 com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:225) 在 com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:127) 在 com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:362) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
我的实体是:
package com.serene.receiptninja.server;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class SyncEvent {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String message;
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message+" Sent from my app engine.";
}
public Long getId() {
return id;
}
}
请求:
package com.serene.receiptninja.shared;
import java.util.List;
import com.google.web.bindery.requestfactory.shared.Request;
import com.google.web.bindery.requestfactory.shared.RequestContext;
import com.google.web.bindery.requestfactory.shared.ServiceName;
@ServiceName(value = "com.serene.receiptninja.server.SyncEventService", locator = "com.serene.receiptninja.server.SyncEventServiceLocator")
public interface SyncEventRequest extends RequestContext {
Request<SyncEventProxy> createSyncEvent();
Request<SyncEventProxy> readSyncEvent(Long id);
Request<SyncEventProxy> updateSyncEvent(SyncEventProxy syncevent);
Request<Void> deleteSyncEvent(SyncEventProxy syncevent);
Request<List<SyncEventProxy>> querySyncEvents();
}
代理:
包 com.serene.receiptninja.shared;
import com.google.web.bindery.requestfactory.shared.ProxyForName;
import com.google.web.bindery.requestfactory.shared.ValueProxy;
@ProxyForName(value = "com.serene.receiptninja.server.SyncEvent", locator = "com.serene.receiptninja.server.SyncEventLocator")
public interface SyncEventProxy extends ValueProxy {
void setMessage(String message);
String getMessage();
Long getId();
}
请求工厂:
import com.google.web.bindery.requestfactory.shared.InstanceRequest;
import com.google.web.bindery.requestfactory.shared.Request;
import com.google.web.bindery.requestfactory.shared.RequestContext;
import com.google.web.bindery.requestfactory.shared.RequestFactory;
import com.google.web.bindery.requestfactory.shared.ServiceName;
import com.serene.receiptninja.shared.MessageProxy;
import com.serene.receiptninja.shared.RegistrationInfoProxy;
import com.serene.receiptninja.shared.SyncEventRequest;
public interface MyRequestFactory extends RequestFactory {
@ServiceName("com.serene.receiptninja.server.HelloWorldService")
public interface HelloWorldRequest extends RequestContext {
/**
* Retrieve a "Hello, World" message from the server.
*/
Request<String> getMessage();
}
@ServiceName("com.serene.receiptninja.server.RegistrationInfo")
public interface RegistrationInfoRequest extends RequestContext {
/**
* Register a device for C2DM messages.
*/
InstanceRequest<RegistrationInfoProxy, Void> register();
/**
* Unregister a device for C2DM messages.
*/
InstanceRequest<RegistrationInfoProxy, Void> unregister();
}
@ServiceName("com.serene.receiptninja.server.Message")
public interface MessageRequest extends RequestContext {
/**
* Send a message to a device using C2DM.
*/
InstanceRequest<MessageProxy, String> send();
}
HelloWorldRequest helloWorldRequest();
RegistrationInfoRequest registrationInfoRequest();
MessageRequest messageRequest();
SyncEventRequest syncEventRequest();
}
安卓代码:
final SyncEventRequest request = requestFactory.syncEventRequest();
request.createSyncEvent().fire(new Receiver <SyncEventProxy>(){
@Override
public void onSuccess(SyncEventProxy arg0) {
// TODO Auto-generated method stub
message = arg0.getMessage();
}
});
【问题讨论】:
标签: google-app-engine gwt gwt-rpc android-c2dm