JBoss4.2.2GAでSeasar2を動かしてみる
判ってる人が誰も居ない場に放り込まれ、諸々の与件のみ伝えられたまま放置。もう右も左もなんとやらで・・・とめげていたら、こんな神資料を発見。
http://www.slideshare.net/bose999/jboss-application-server-seasar2-on-seasar-conference-2009-white
最新のS2であればJavaEEサーバごとのjta.diconが用意されてるので、それに置き替えてやればよいのだな。よし判った。bose999さん有難うございます!
感謝感激しつつ、4.2.2GAでもそうそうやる事変わるまいなんて作業。以下詳細は上記URLを御参照下さい。
と手順通りにやったところで、動かない。TransactionSynchronizationRegistry がありませんエラーが出てしまう。前にもTomcat環境で同じ事が起きて、geronimo-jta_1.0_spec-1.0.jar を geronimo-jta_1.1_spec-1.0.jar に変えて動くようになったんだったなあ、などと思い出しつつ。
TransactionSynchronizationRegistry インタフェースは JTA1.1 から追加されたのですね。ふむ。
そうなのだ、JBoss4.2.2はJavaEE5完全準拠ではないのであった、とjboss-j2ee.jar の中身を調べてみたら確かにJTA1.0の内容で、なんとかしないと。
どうやらS2Container の配布zipの中に、JTA1.0 と 1.1 の差分だけ入っているという、geronimo-jta_1.1_spec-1.0-tsr.jar なるものが入ってるとの事で、調べると要するに上記インタフェースが入ってるだけのjarで、これを JBOSS_SERVER_CONFIG/lib に入れてみた。
クラスが見つかりませんエラーはでなくなったけど、今度は JNDI で java:comp/TransactionSynchronizationRegistry が lookup できません。
jar 置いただけで JNDI に登録してませんので当然ですね。
S2のドキュメントでは、JBoss4.2以降であれば、jta.dicon の代わりに jta-jboss42.dicon を使えばよいとの記述があるのですが、その中で TransactionSynchronizationRegistry を JNDI lookup してるみたいですね。と思って確認したらその通りでした。
<!-- TransactionSynchronizationRegistry from JNDI --> <component name="TransactionSynchronizationRegistry" class="javax.transaction.TransactionSynchronizationRegistry"> @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/TransactionSynchronizationRegistry") </component>
なので、4.2より前のバージョン用の jta-jboss.dicon を使う事にします。こちらは同じ個所はこうなってます。
<!-- TransactionManager を利用する TransactionSynchronizationRegistry --> <component name="TransactionSynchronizationRegistry" class="org.seasar.extension.jta.TransactionSynchronizationRegistryImpl"/>
jta-jboss42.dicon との差分を見ると、この部分の違いだけですので問題ないでしょう。
という訳で、s2container.dicon はこう書き直して
<component class="org.seasar.framework.container.factory.SimplePathResolver" > <initMethod name="addRealPath" > <arg>"jta.dicon"</arg> <arg>"jta-jboss.dicon"</arg> </initMethod> </component>
無事動きました。cubbyが動いたばんざーい。
てなことを先々週にやってました・・・・あれからなーんにも進んでません・・・。
書き忘れましたが、S2のバージョンは 2.4.38 です。