第37夜 Glassfish 3.1の埋め込みAPIからのさくさくEJB

JavaEEの構成要素で一番テストしにくかったものはなんだろう。おそらくEJBだ。

アノテーションによる注入をいち早く導入し、開発の容易さは大幅によくなったもののデプロイと実行が(環境によっては)手間だったかもしれない。

JavaEEではロジックをすべてPOJOにしてCDIEJBに注入することによって大幅に楽になった。が、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/)」と表示される。