我正在尝试编写一个包含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;
}
任何帮助将不胜感激!
答案 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;
问题消失了。