Google App Engine でどうしても例外が発生しちゃうの
前任者からの引き継ぎで、Google App Engine 上のとあるファイルアップローダーの開発を引き継ぎました。
Google Plugin for Eclipse を入れて Eclipse 上で開発 → ローカルデバッグするぜー! ってところまで来たのですが、DBにデータ書き込むぞーって所(== JDO 関連)でコケてしまうという状態に陥りました。
↓エラー内容はこんな感じ。 直接例外を発生させているところが、自分の所じゃないのがまた謎を深めさせるワケでして…なんでかなぁなんでかなぁ…と。
HTTP ERROR 500 Problem accessing /test. Reason: Illegal argument Caused by: javax.jdo.JDOFatalUserException: Illegal argument at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:344) at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:674) at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694) at com.kanaria.love.android.upload.DatastoreUtils.insertGoogleFile(DatastoreUtils.java:103) at com.kanaria.love.android.upload.DatastoreUtils.insertGoogleFile(DatastoreUtils.java:71) at com.kanaria.love.android.upload.FileUploadSurvlet.doPost(FileUploadSurvlet.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) NestedThrowablesStackTrace: java.lang.IllegalArgumentException at com.google.appengine.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:74) at com.google.appengine.api.datastore.dev.LocalDatastoreService.getOrCreateProfile(LocalDatastoreService.java:1112) at com.google.appengine.api.datastore.dev.LocalDatastoreService.beginTransaction(LocalDatastoreService.java:907) 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 com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:307) at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:264) at java.util.concurrent.Executors$PrivilegedCallable$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.util.concurrent.Executors$PrivilegedCallable.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.IllegalArgumentException at com.google.appengine.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:74) at com.google.appengine.api.datastore.dev.LocalDatastoreService.getOrCreateProfile(LocalDatastoreService.java:1112) at com.google.appengine.api.datastore.dev.LocalDatastoreService.beginTransaction(LocalDatastoreService.java:907) 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 com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:307) at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:264) at java.util.concurrent.Executors$PrivilegedCallable$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.util.concurrent.Executors$PrivilegedCallable.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
結論としては
バージョン不一致でした。 orz
前任者が ver 1.2.8 を利用。 おいらは、ver 1.3.2 を使っていることが原因でした。
とはいえ、自前で書いたコード部分で問題は一切無かったのです。 SDK側のライブラリの構成が異なってしまいコンパイルエラーとかも無く普通にビルドできていました。
…が! 問題はココにあった!
古いライブラリもsvnにコミットされていた → おいら何も知らずにプロジェクト全体をチェックアウトしちゃってたよHAHAHA!! orz
対応策
1.) 古いjarファイルをごっそり削除。
2.) そのままだと新しいjarファイルがコピーされないので、プロジェクトの App Engine の設定画面を開いて "Configure SDKs" をクリック → 何もせずにOKを押しちゃう → 新しいjarファイルがコピーされるぞォォォ!!
としたところ、(とりあえず)問題なく動作するようになりましたとさ。めでたしめでたし。
…ちくしょう薔薇水晶め……