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側のライブラリの構成が異なってしまいコンパイルエラーとかも無く普通にビルドできていました。

…が! 問題はココにあった!



http://ir9.jp/hd10/0421_00.png

古いライブラリもsvnにコミットされていた → おいら何も知らずにプロジェクト全体をチェックアウトしちゃってたよHAHAHA!! orz


対応策

1.) 古いjarファイルをごっそり削除。

2.) そのままだと新しいjarファイルがコピーされないので、プロジェクトの App Engine の設定画面を開いて "Configure SDKs" をクリック → 何もせずにOKを押しちゃう → 新しいjarファイルがコピーされるぞォォォ!!

http://ir9.jp/hd10/0421_01.png




としたところ、(とりあえず)問題なく動作するようになりましたとさ。めでたしめでたし。








…ちくしょう薔薇水晶め……