2

我正在尝试编写一个具有事件实体的简单应用程序。

通过自动生成的端点 API 将事件实体添加到云中,以及通过它的 id 检索事件。问题是当我尝试更新事件时。eventInCloud 与我使用数据存储查看器看到的相同。我将另一个元素添加到它的名为 Participants 的字符串列表中,并尝试在数据存储中更新它。这是代码:

try {
        Event eventInCloud = endpoint.getEvent(eventLocal.getId()).execute();
        eventInCloud.getParticipants().add("coolman@gmail.com");
        endpoint.updateEvent(eventInCloud).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }

我在 Eclipse 中看到的错误消息是:

06-30 18:53:07.415: W/System.err(3448): com.google.api.client.googleapis.json.GoogleJsonResponseException: 503 服务不可用 06-30 18:53:07.415: W/System.err( 3448):{ 06-30 18:53:07.415:W/System.err(3448):“代码”:503、06-30 18:53:07.415:W/System.err(3448):“错误”: [ { 06-30 18:53:07.415:W/System.err(3448):“域”:“全局”,06-30 18:53:07.415:W/System.err(3448):“消息”: “java.lang.NullPointerException”,06-30 18:53:07.415:W/System.err(3448):“原因”:“backendError”06-30 18:53:07.415:W/System.err(3448) : } ],06-30 18:53:07.415:W/System.err(3448):“消息”:“java.lang.NullPointerException”06-30 18:53:07.415:W/System.err(3448) : } 06-30 18:53:07.415: W/System.err(3448): at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:111) 06-30 18:53:07.415: W/System.err(3448): at com.google.api.client.googleapis .services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:38) 06-30 18:53:07.415: W/System.err(3448): 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse (AbstractGoogleClientRequest.java:312) 06-30 18:53:07.415: W/System.err(3448): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1042) 06-30 18 :53:07.415: W/System.err(3448): 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410) 06-30 18:53:07.415: W/System。错误(3448):在 com.google.api。client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) 06-30 18:53:07.415: W/System.err(3448): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute (AbstractGoogleClientRequest.java:460) 06-30 18:53:07.415: W/System.err(3448): at com.evman.model.Events.updateEventInCloud(Events.java:83) 06-30 18:53:07.415 : W/System.err(3448): 在 com.evman.model.Events.access$1(Events.java:69) 06-30 18:53:07.415: W/System.err(3448): 在 com.evman .model.Events$UpdateEventTask.doInBackground(Events.java:107) 06-30 18:53:07.415: W/System.err(3448): at com.evman.model.Events$UpdateEventTask.doInBackground(Events.java: 1) 06-30 18:53:07.415: W/System.err(3448): 在 android.os.AsyncTask$2.call(AsyncTask.java:287) 06-30 18:53:07.415: W/System.err (3448):在 java.util.concurrent.FutureTask.run(FutureTask.java:234) 06-30 18:53:07.415: W/System.err(3448): 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java :230) 06-30 18:53:07.415: W/System.err(3448): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 06-30 18:53:07.415: W/System .err(3448):在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 06-30 18:53:07.415:W/System.err(3448):在 java.lang.Thread。运行(线程.java:856)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 06-30 18:53:07.415: W/System.err(3448): 在 java.lang.Thread.run(Thread.java:第856章)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 06-30 18:53:07.415: W/System.err(3448): 在 java.lang.Thread.run(Thread.java:第856章)

我在服务器端得到的错误是这样的:

com.google.api.server.spi.SystemService invokeServiceMethod: null java.lang.NullPointerException at com.google.appengine.api.datastore.KeyTranslator.convertToPb(KeyTranslator.java:49) at com.google.appengine.api.datastore .AsyncDatastoreServiceImpl.doBatchGetBySize(AsyncDatastoreServiceImpl.java:316) 在 com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.get(AsyncDatastoreServiceImpl.java:280) 在 com.google.appengine.api.datastore.DatastoreServiceImpl$1.runInternal(DatastoreServiceImpl. java:68) 在 com.google.appengine.api.datastore.DatastoreServiceImpl$1.runInternal(DatastoreServiceImpl.java:65) 在 com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:29) 在 com. google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:65) com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:55) com.google.appengine.datanucleus.WrappedDatastoreService.get(WrappedDatastoreService.java:60) com.google.appengine.datanucleus .EntityUtils.getEntityFromDatastore(EntityUtils.java:665) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:543) 在 org.datanucleus.state.JDOStateManager.loadFieldsFromDatastore(JDOStateManager.java:1638) 在 org. datanucleus.state.JDOStateManager.loadUnloadedFieldsInFetchPlan(JDOStateManager.java:1363) at org.datanucleus.state.JDOStateManager.detach(JDOStateManager.java:2718) at org.datanucleus.ObjectManagerImpl.performDetachOnCloseWork(ObjectManagerImpl.java:4571) at org.datanucleus .ObjectManagerImpl。performDetachOnClose(ObjectManagerImpl.java:4534) at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1105) at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) at com.evman.eventmanager.EventEndpoint .containsEvent(EventEndpoint.java:165) 在 com.evman.eventmanager.EventEndpoint.updateEvent(EventEndpoint.java:123) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java :57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:45) 在 com.google.api.server.spi.SystemService.invokeServiceMethod( SystemService.java:320) 在 com.google.api.server.spi.SystemServiceServlet。在 com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:80) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet 执行(SystemServiceServlet.java:122) .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) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay。 jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 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) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 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.headerComplete(HttpConnection.java:923) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 com.google.tracing.TraceContext$TraceContextRunnable。runInContext(TraceContext.java:483) 在 com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:490) 在 com.google.tracing.TraceContext.runInContext(TraceContext.java:777) 在 com.google。 tracking.TraceContext$DoInTraceContext.runInContext(TraceContext.java:754) 在 com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:345) 在 com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java: 337) 在 com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:487) 在 java.lang.Thread.run(Thread.java:722)第 777 章.runInInheritedContext(TraceContext.java:337) 在 com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:487) 在 java.lang.Thread.run(Thread.java:722)第 777 章.runInInheritedContext(TraceContext.java:337) 在 com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:487) 在 java.lang.Thread.run(Thread.java:722)TraceContext$TraceContextRunnable.run(TraceContext.java:487) at java.lang.Thread.run(Thread.java:722)TraceContext$TraceContextRunnable.run(TraceContext.java:487) at java.lang.Thread.run(Thread.java:722)

生成的后端代码是:

@ApiMethod(name = "updateEvent")
public Event updateEvent(Event event) {
    EntityManager mgr = getEntityManager();
    try {
        if (!containsEvent(event)) {
            throw new EntityNotFoundException("Object does not exist");
        }
        mgr.persist(event);
    } finally {
        mgr.close();
    }
    return event;
}

private boolean containsEvent(Event event) {
    EntityManager mgr = getEntityManager();
    boolean contains = true;
    try {
                    // added the following if for the first time when i add the entity
        if(event.getKey()==null){
            return false;
        }
        Event item = mgr.find(Event.class, event.getKey());
        if (item == null) {
            contains = false;
        }
    } finally {
        mgr.close();
    }
    return contains;
}

任何帮助将不胜感激!

4

2 回答 2

1

问题似乎出现在containsEvent()方法中。在您的本地,编辑后eventsincloud,您将 JSON 传递给您的端点方法updateEvent。然后调用containsEvent,传递一个 JSON 作为参数event,在这里你调用getKey()事件的方法。应用引擎方法getKey()用于从实体实例而不是从实体的 JSON 表示中获取键值。您可以修改您的updateEvent以通过其 Id 查询实体,类似于getEvent. 您可以在云中找到 id,也可以在本地获取它,就像在 eventLocal.getId() 中一样,这是一种将 id 存储在 JSON 中的本地方法。然后在您的端点方法中,您可以使用 id 来查询所需的实体(工作代码应该已经在getEvent) 然后将新值添加到检索到的实体中,然后保存该实体。

于 2013-07-04T05:16:54.553 回答
1

托尼的回答帮助我意识到我以错误的方式使用了钥匙。

我有:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

我认为导致问题的原因。一旦我将其更改为:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

问题消失了。

于 2013-07-05T06:27:55.520 回答