Google Docs Java API中ListEntry.update()上的com.google.gdata.util.PreconditionFailedException

时间:2013-09-25 13:53:46

标签: java google-api

我有一个操作Google电子表格行的应用程序。偶尔,当我调用ListEntry.update()时,我会收到以下堆栈跟踪:

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: com.google.gdata.util.PreconditionFailedException: Precondition Failed
Mismatch: etags = ["E10QemAgYit7ImA-CEFaShYM"], version = [2ag9hk74om621l]
at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:614)
at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:564)
at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:560)
at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:538)
at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:536)
at com.google.gdata.client.Service.update(Service.java:1563)
at com.google.gdata.client.Service.update(Service.java:1530)
at com.google.gdata.client.GoogleService.update(GoogleService.java:597)
at com.google.gdata.data.BaseEntry.update(BaseEntry.java:639)
at feedProcessor.ProcessClientFeed.UpdateRow(ProcessClientFeed.java:466)
at feedProcessor.ProcessClientFeed.updateGoogleSpreadsheet(ProcessClientFeed.java:404)
at feedProcessor.ProcessClientFeed.processFeed(ProcessClientFeed.java:318)
at feedProcessor.ProcessClientFeed.main(ProcessClientFeed.java:61)
... 5 more

2 个答案:

答案 0 :(得分:4)

以下是相关文件:

https://developers.google.com/gdata/javadoc/com/google/gdata/data/spreadsheet/ListEntry

https://developers.google.com/gdata/javadoc/com/google/gdata/data/BaseEntry#update()

根据这些文档,update()函数甚至无法抛出PreconditionFailedException,因此这里的文档基本上没用。测试该问题表明,当您尝试在会话中多次调用同一行上的update()函数时,将引发此异常。究竟什么定义'会话'仍然不清楚,但如果你不止一次遍历所有行,并在每次迭代中的每一行调用update(),你将得到此错误。我所知道的唯一解决方案是编写软件,使每行(ListEntry)只有一次调用update()。

答案 1 :(得分:3)

问题是由Google电子表格API Resource Versioning mecanism引起的。

无论如何都能编辑条目 - 只需使用:

entry.setEtag("*")

更新前。

是的,这不是多用户友好的。如果您需要多用户支持,请重新提取Feed。