February 23, 2008

JBoss4.2.xにおける@EJBアノテーション

JBoss4.2はServlet2.5/EJB3にデフォルトで対応しているので、Webコンテナ上で動作するコンポーネントで @EJB アノテーションが当然使えると思っていました。

JNDIルックアップのコードを書かなくても、EJBのビジネスインタフェース型のフィールドに「@EJB」とアノテーションをつけておけば、フィールド初期化時にコンテナが裏でコッソリEJBオブジェクトのインスタンスを取得してフィールドにセットしてくれるという機能です。アノテーションによるDI(Dependency Injection)ってやつですね。

@EJB
private HogeService;

こう書いておけば、コンテナがこのフィールドを初期化する際に、HogeServiceインタフェースを実装したEJBオブジェクトをJNDIサービスより取得してフィールドにセットしてくれます。

しかし、結論から言うとJBoss4.2ではWebコンテナ上でのこの動作はサポートされていません。
JBossの公式文書に下記のような記述がありました。

Java EE 5 allows you to inject EJB3 bean instances directly into the web application via annotations without explicit JNDI lookup. This behavior is not yet supported in JBoss AS 4.2.
http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbossas/projects/docs/trunk/Server_Configuration_Guide/ja-JP/EJB3.po?revision=65669&pathrev=68449

JBoss4.2.xはEJB3 (JSR-220) 対応のEJBコンテナを実装し、Servlet2.5 (JSR-154) 対応のWebコンテナを実装していますが、Common Annotations (JSR-250) は完全に実装されていないようです。

結局、ServletコンテナからEJBを利用するには従来のEJB2.x時代のようにJNDIルックアップするコードを書かなくてはいけません。


・・・道理で、Web上にもWebコンテナから@EJBでEJBオブジェクトをインジェクションするサンプルが見つからないわけです。

これで1日ぐらいハマりました。

今度のセミナーではCommon Annotations (JSR-250) が動作する JBoss5.0.0Beta4を使うことにします・・・


それにしても、JBossの情報って少ないですね。利用者が減っているのでしょうか?少なくともネット上の情報を探す限りでは、積極的にブログ等へ情報をアップするエッジの効いたエンジニアの利用が減っている感じがします。
JavaEE5完全対応のアプリケーションサーバを正式リリースできていないのはJBossだけですしね。OSSのJavaEEアプリサーバでは、最近はGlassfishの勢いが目立ちます。GlassfishはNetBeansにも標準でバンドルされるようになったし。

※ところが、JBoss5.0.0Beta4はJMSがうまく動かなかったり、セキュリティロールがうまく動かなかったりでした。具体的には、QueueのJNDIサービスへの登録時に例外が発生してデプロイできません。セキュリティロールは、@RollsAllowedで指定していないロールでもメソッドの実行が許可されてしまいました。まあ、βなのでこんなもんですね・・・