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、テストクラスの自動生成
- コントローラの場所
- 実行
- プロジェクトを右クリックし[Run As] > [Web Application]を実行。
- http://localhost:8080/guestbookにアクセスするとページが表示される
- モデルを作る
あとは、slim3it内のサンプルのようにやっていけば何とかなるかも。もしエラーとかが出たら、プロジェクトをクリーンしたり、サーバを再起動したりやる。あ、slim3-blankを使う時は、slim3itからsrc/META-INF/jdoconfig.xmlをコピって持ってきたほうがいいかも。
前のslim3やSAStrutsとパッケージ構成が違うのはなぜだろう。例えば、前は1つのコントローラ内に複数のアクションを定義しいたけど、今回のslim3はコントローラごとにパッケージが分かれ、その中にアクションの数だけクラスが出来てる感じ。Viewの部分は前はWEB-INF/viewの中に各コントローラに対応したディレクトリが出来てたけど、今回はWEB-INFと同じ階層にできたり。
そうそう、同じコントローラ内(例えば、guestbook)内で共通で使いたい機能があったときってどうするんだろ。例えば、データにアクセスるfindAllメソッドをIndexControllerとAddControllerで使いたいときとか。。
ん。普通にクラス作ってPersistenceManager渡せばいいのか。そうしよう。