Slim3 GAE/Jをつかってみた。

デモアプリと、空のプロジェクト(blankプロジェクト)をダウンロード。SVNで。

svn checkout http://slim3.googlecode.com/svn/trunk/ slim3-read-only

チェックアウトすると以下のプロジェクトが含まれている。

slim3itがGAE/J版のデモみたい。slim3-blankがGAE/J版の空のプロジェクトらしいが、どうもslim3itのjdbconfig.xmlと内容が違ってて、slim3-blankでサンプルを作ってたんだけどうまく動かずにハマってしまった。
こんなエラーがでたので、

javax.jdo.JDOUserException: Cannot make object transient since object is new and not yet committed
FailedObject:11
	at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:422)
	at org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:280)
	at org.slim3.controller.JDOController.tearDown(JDOController.java:78)
	at org.slim3.controller.Controller.runBare(Controller.java:84)
	at org.slim3.controller.FrontController.processController(FrontController.java:470)
	at org.slim3.controller.FrontController.doFilterInternal(FrontController.java:293)
	at org.slim3.controller.FrontController.doFilter(FrontController.java:254)
	at org.slim3.controller.FrontController.doFilter(FrontController.java:212)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at org.mortbay.jetty.Server.handle(Server.java:313)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)

jdoconfig.xmlに以下の行を追加。なんか他の設定内容もslim3itのjdoconfig.xmlと違ってたりしたので修正した。で、最終的にはslim3itの内容と同じになった。

       <property name="javax.jdo.option.DetachAllOnCommit" value="true"/>

それなりにルールがあるみたいだけど、どこに書いてるのか分からず手探り状態。ドキュメントないのかな。

  • コントローラ、JSP、テストクラスの自動生成
    • build.xmlを開き、Outlineから「gen-controller」を実行、「/guestbook/」と入力(guestbookコントローラを作りたい時)
    • slime3.controller.guestbookパッケージ以下にコントローラクラスが出来る
    • slime3-blank > war > guestbookフォルダができ、その中にindex.jspが出来る
  • コントローラの場所
    • slim3-blank > war > WEB-INF > appengine-web.xml内のslim3.controllerPackageプロパティの値(デフォルトは「slim3.controller」)
  • 実行
    • プロジェクトを右クリックし[Run As] > [Web Application]を実行。
    • http://localhost:8080/guestbookにアクセスするとページが表示される
  • モデルを作る
    • modelパッケージの中に作る。(たとえば、slim3.modelなのかにつくる)ここにモデルクラスがないとだめっぽい。
    • slim3-blank > .settings > com.google.appengine.eclipse.core.prefs このファイルの中で指定されてるから、かな。
    • モデルを作って保存すると裏で何かが動いてる。

あとは、slim3it内のサンプルのようにやっていけば何とかなるかも。もしエラーとかが出たら、プロジェクトをクリーンしたり、サーバを再起動したりやる。あ、slim3-blankを使う時は、slim3itからsrc/META-INF/jdoconfig.xmlをコピって持ってきたほうがいいかも。

前のslim3SAStrutsとパッケージ構成が違うのはなぜだろう。例えば、前は1つのコントローラ内に複数のアクションを定義しいたけど、今回のslim3はコントローラごとにパッケージが分かれ、その中にアクションの数だけクラスが出来てる感じ。Viewの部分は前はWEB-INF/viewの中に各コントローラに対応したディレクトリが出来てたけど、今回はWEB-INFと同じ階層にできたり。
そうそう、同じコントローラ内(例えば、guestbook)内で共通で使いたい機能があったときってどうするんだろ。例えば、データにアクセスるfindAllメソッドをIndexControllerとAddControllerで使いたいときとか。。
ん。普通にクラス作ってPersistenceManager渡せばいいのか。そうしよう。