2013-09-25 5 views
5

Ho un'applicazione che manipola le righe di un foglio di calcolo di google. Di tanto in tanto, quando chiamo ListEntry.update(), viene visualizzato il seguente stack trace:com.google.gdata.util.PreconditionFailedException su ListEntry.update() nell'API Java di Google Documenti

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 

risposta

4

Ecco la relativa documentazione:

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

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

Secondo questi documenti, la funzione update() non è nemmeno in grado di lanciare una PreconditionFailedException, quindi i documenti sono sostanzialmente inutili qui. Il test del problema ha dimostrato che questa eccezione viene generata quando si tenta di chiamare la funzione update() sulla stessa riga più di una volta in una sessione. Ciò che definisce una "sessione" non è ancora chiaro, ma se si esegue il loop di tutte le righe più di una volta e si chiama update() su ogni riga in ogni iterazione, si otterrà questo errore. L'unica soluzione di cui sono a conoscenza è scrivere il software in modo tale che ogni riga (ListEntry) abbia update() chiamata una sola volta.

3

Il problema è causato dall'API di Google Spreadsheet Resource Versioning mecanism.

Per essere in grado di modificare la voce non importa quale - basta usare:

entry.setEtag("*") 

prima dell'aggiornamento.

E sì, questo non è multi-user-friendly. Riavvia il feed se hai bisogno del supporto multiutente.

Problemi correlati