第37夜 Glassfish 3.1の埋め込みAPIからのさくさくEJB
JavaEEの構成要素で一番テストしにくかったものはなんだろう。おそらくEJBだ。
アノテーションによる注入をいち早く導入し、開発の容易さは大幅によくなったもののデプロイと実行が(環境によっては)手間だったかもしれない。
JavaEEではロジックをすべてPOJOにしてCDIでEJBに注入することによって大幅に楽になった。が、EJBという形でもテストしたいことは多いだろう。
ある程度のサービスを結合したテストというわけだ。
EJBを作ってみる
まずはシングルトン、ステートレス、ステートフルEJBを作る。
package ejb; import javax.ejb.Singleton; @Singleton(name="calcSingleton") public class CalcS { public int add(int a,int b){ return a + b; } }
package ejb; import javax.ejb.Stateless; @Stateless(name="calcStateless") public class CalcSL { public int add(int a,int b){ return a + b; } }
package ejb; import javax.ejb.Stateful; @Stateful(name="calcStateful") public class CalcSF { public int add(int a,int b){ return a + b; } }
テストコード
昨日のエントリのデプロイ後の部分に以下のコードを追加する。
{ CalcS calc = (CalcS) InitialContext.doLookup("java:global/hoge/calcSingleton!ejb.Calc"); System.out.println(calc +":"+ calc.add(1, 2) ); } { CalcSL calc = (CalcSL) InitialContext.doLookup("java:global/hoge/calcStateless!ejb.CalcSL"); System.out.println(calc +":"+ calc.add(1, 2) ); } { CalcSF calc = (CalcSF) InitialContext.doLookup("java:global/hoge/calcStateful!ejb.CalcSF"); System.out.println(calc +":"+ calc.add(1, 2) ); }
実行するとそれぞれインスタンスと足し算の結果の3が表示される。
EJBContainerを使う方法に比べるとよりシンプル・・・のようだ。カレントスレッドのクラスローダを表示すると「APIClassLoader」というのに変更されているのがわかる。取得したインスタンスのクラスのクラスローダを表示すると「WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)」と表示される。