无法使用自动生成的后端API更新appengine后端中的实体

时间:2013-06-30 16:11:14

标签: android google-app-engine google-cloud-endpoints

我正在尝试编写一个包含Event Entitys的简单应用程序。

通过自动生成的端点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):" domain" :"全球",   06-30 18:53:07.415:W / System.err(3448):" message" :" 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):" message" :" 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):at 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):at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)   06-30 18:53:07.415:W / System.err(3448):at 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):at com.evman.model.Events.access $ 1(Events.java:69)   06-30 18:53:07.415:W / System.err(3448):at 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):at 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):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)   06-30 18:53:07.415:W / System.err(3448):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)   06-30 18:53:07.415:W / System.err(3448):at java.lang.Thread.run(Thread.java:856)

我在服务器端遇到的错误是:

  

com.google.api.server.spi.SystemService invokeServiceMethod:null   显示java.lang.NullPointerException       在com.google.appengine.api.datastore.KeyTranslator.convertToPb(KeyTranslator.java:49)       在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)       at org.datanucleus.state.JDOStateManager.loadFieldsFromDatastore(JDOStateManager.java:1638)       at org.datanucleus.state.JDOStateManager.loadUnloadedFieldsInFetchPlan(JDOStateManager.java:1363)       在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)       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)       at 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.execute(SystemServiceServlet.java:122)       在com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:80)       在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)       在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)       在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)       在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)       at 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.tracing.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)

当然,生成的后端代码是:

@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;
}

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

Tony的回答让我意识到我以错误的方式使用了Key。

我有:

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

我认为造成了什么问题。 我一改为:

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

问题消失了。