JBoss5 CR1で、Sunのチュートリアルを動かす。
SunのJavaEEチュートリアルにある、EJB3のサンプル、converterを、JBoss5 CR1で動かしてみた。で、結論から言うと動かないわけなんだけど、原因を見てみると、EJBのルックアップで失敗している。JSFなら、インジェクションできるんだけど、JSPなんで、JNDIルックアップをしている。チュートリアルでは、
InitialContext ic = new InitialContext();
converter = (Converter)ic.lookup(Converter.class.getName());
という感じで、クラスのパッケージ名を含めた完全修飾名を渡すことで取得している。JBossでは、これだと見つからないと言われる。ここの名前は”アプリケーション名/EJB名/remote"という書式で指定する必要があるようだ(追記:nekopさんからの情報で、やはりJNDI名は仕様で規定されていないらしい)。
InitialContext ic = new InitialContext();
converter = (Converter)ic.lookup("converter/ConverterBean/remote");
先頭の"converter"は、EARファイルの名前から".ear"を除いたもの。ConverterBeanの部分はEJBの実装クラス名。これはよろしくないので、@Stateless(name = "XXX")として、抽象的な名前を指定してやるのが良いかと思われる。
で、これだけだと、Converterにはキャストできないというエラーが出る。どうも別のクラスローダで、Converterインターフェースを読んでしまうようだ(これはJBossのバグなのかもしれない これもnekopさんからの情報によると、チュートリアルが、EJBのjarを、Web moduleのWEB-INF/libに入れてしまっているせい。このあたりも現在の仕様では明確な規定が無いそうだ)。jndi.propertiesをWebアプリケーションのクラスパスに入れてやればok (これは、Web ModuleのWEB-INF/classes, libからEJBのインターフェースを除いてやれば不要)。
java.naming.factory.url.pkgs=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=localhost
う〜む、このあたりの互換性が無いのは、問題なんじゃないだろうか。





