2013-09-25 35 views
5

Tôi có một ứng dụng điều khiển các hàng của bảng tính google. Thỉnh thoảng, khi tôi gọi ListEntry.update(), tôi nhận được stack trace sau:com.google.gdata.util.PreconditionFailedException trên ListEntry.update() trong Google Documents Java API

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 

Trả lời

4

Dưới đây là tài liệu có liên quan:

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

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

Theo các tài liệu, hàm update() thậm chí không có khả năng ném một PreconditionFailedException, vì vậy các tài liệu cơ bản là vô dụng ở đây. Kiểm tra vấn đề đã chỉ ra rằng ngoại lệ này được ném ra khi bạn cố gọi hàm update() trên cùng một hàng nhiều lần trong một phiên. Chính xác những gì định nghĩa một 'phiên' vẫn chưa rõ ràng, nhưng nếu bạn lặp qua tất cả các hàng của bạn nhiều hơn một lần, và gọi update() trên mỗi hàng trong mỗi lần lặp, bạn sẽ nhận được lỗi này. Độ phân giải duy nhất mà tôi biết là viết phần mềm của bạn sao cho mỗi hàng (ListEntry) có cập nhật() chỉ được gọi một lần.

3

Sự cố là do API bảng tính Google Resource Versioning mecanism gây ra.

Để có thể chỉnh sửa các entry không có vấn đề gì - chỉ cần sử dụng:

entry.setEtag("*") 

trước khi cập nhật.

Và có, điều này không thân thiện với nhiều người dùng. Tìm nạp lại nguồn cấp dữ liệu nếu bạn cần hỗ trợ nhiều người dùng.

Các vấn đề liên quan