DoltengでS2JDBC利用プロジェクトを作る際の追加作業
新しく何か作ろうとするたびに引っかかるので、メモ書きしておく。
手順をだらだら書いてみるが、これは「別にひねくれたことしてないよ!」(よね?)と言いたいだけなので、斜め読みでよし。
- Eclipse3.3 + Dolteng0.32.0でプロジェクト作成、Presentation = None, Persistence = S2JDBC
- DB作成
- jdbc.diconとs2jdbc.diconを環境に合わせて編集
- 適当にEntity作成
- S2JDBC-GenでDDL生成、続けてマイグレーション(ここでServiceが作られる)
- 適当にService使うコード書いて、実行
- 例外発生
Exception in thread "main" java.lang.NullPointerException at org.seasar.extension.jdbc.service.S2AbstractService.select(S2AbstractService.java:96) at com.gmail.idesaku.myproject.service.HogeService$$EnhancedByS2AOP$$9bbd86.$$select$$invokeSuperMethod$$(HogeService$$EnhancedByS2AOP$$9bbd86.java) at com.gmail.idesaku.myproject.service.HogeService$$EnhancedByS2AOP$$9bbd86$$MethodInvocation$$select12.proceed(MethodInvocationClassGenerator.java) ...
S2AbstractService内で自動的にバインディングされるはずのjdbcManagerが、そうならずnullのまま放置されており、これを使おうとしてNullPointerExceptionがthrowされるという。
これは、S2Tigerに含まれるgeronimo-ejb_3.0_spec-1.0.jarとgeronimo-interceptor_3.0_spec-1.0.jarをクラスパスに追加することで解消する。マニュアルによると、これらはEJB3を利用するときに必要になるそうだ。いつの間にEJB3を使っていたのかわからないが、たぶんS2JDBCが使っているのだろう。というか、調べてみたらS2AbstractServiceで使っているResourceアノテーションがEJB3の代物じゃないか。
これらのライブラリは動作環境によっては不要な場合がある*1ので、Doltengはクラスパスに追加してくれないということだろうか。しかし、条件的に似ているgeronimo-jpa_3.0_spec-1.0.jarとgeronimo-annotation_1.0_spec-1.0.jarがデフォルトで追加されているのだから、先の二者も追加してくれていいんじゃないかとも思う。
こちらの記事およびコメントを参考にさせていただきました。どもです。: S2AbstractService の jdbcManager がDIされない(2) - starwars2の日記
追記
Doltengの次のリリースからはこの問題は解消されるそうだ。
今回足りないことになっていたEJB3用の2つのライブラリは、Seaser2 2.4.30から不要になっているそうである(Dolteng0.32.0は2.4.29を使う)。
試しに、クラスパスをプロジェクト作成直後の状態に戻した上で、Seasar2関連のライブラリ(s2-framework, s2-extension, s2-tiger)を全て2.4.30のものに置き換えて動かしてみたところ、ちゃんと動いた。
id:koichik氏、コメントありがとうございます。それにしても、id:higayasuo氏といいid:taedium氏といい、Seasar2コミッタの皆さんのアンテナの高さとレスポンスの早さはすごいですね。こんな場末のメモ書きに速攻回答していただけるとは。
*1:JavaEE5対応のAPサーバでは不要