2013-09-25 7 views
5

Mam aplikację, która manipuluje rzędami arkusza kalkulacyjnego google. Od czasu do czasu, gdy zgłoszę ListEntry.update(), pojawia się następujący ślad stosu:com.google.gdata.util.PreconditionFailedException na ListEntry.update() w Dokumentach Google 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 

Odpowiedz

4

Oto stosowne dokumenty:

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

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

Według tych Dokumentach Funkcja update() nie może nawet rzucić wyjątku PreconditionFailedException, więc dokumenty są w zasadzie tutaj bezużyteczne. Testowanie problemu wykazało, że ten wyjątek jest generowany podczas próby wywołania funkcji update() w tym samym wierszu więcej niż raz w sesji. Dokładnie to, co definiuje "sesję", jest wciąż niejasne, ale jeśli przeszukujesz wszystkie swoje wiersze więcej niż raz i wywołujesz update() w każdym wierszu w każdej iteracji, otrzymasz ten błąd. Jedyne znane mi rozwiązanie to napisanie twojego oprogramowania w taki sposób, że każdy wiersz (ListEntry) ma aktualizację() tylko raz.

3

Problem jest spowodowany przez Google Spreadsheet API Resource Versioning mecanism.

Aby móc edytować wpis nie ważne co - wystarczy użyć:

entry.setEtag("*") 

przed aktualizacją.

I tak, nie jest to przyjazne dla wielu użytkowników. Ponownie pobierz plik danych, jeśli potrzebujesz pomocy dla wielu użytkowników.

Powiązane problemy