T2FrameworkをEJB対応させてみた

やっつけで。


まずはAdapterクラス。JNDIで取得するだけ。3.1の命名規則で。

public class EJBAdapter extends SimpleContainerAdapter{

    private String base;


    @Override
    public synchronized void init(String configPath) {
        super.init(configPath);

        System.out.println("base:"+configPath);

        base = "java:global/"+configPath + "/";
    }
    

    @Override
    public <T> T getComponent(Class<? super T> componentClass) {
        try {
            String name = base +
                    componentClass.getSimpleName() + "#" + componentClass.getName();
            
            return (T)InitialContext.doLookup(name);
        } catch (NamingException ex) {
            Logger.getLogger(EJBAdapter.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

}


どうやらinitメソッドで「t2.config」に設定された値が取得できるようなのでそこを基点として取得する。EJB3.1はweb.xmlの「display-name」を基点とするようだ。スペースはアンダースコアに変換されるようだ。したがってT2のサンプルならば「T2_Application_Example」をセットすればよいということになる。で、これを取得する部分を作ろうと思ったが、今回はやっつけでいいので、t2.configの値をそのまま使うことにした。

あとはPageクラスに「@Stateless」をつけるだけ。Helloのサンプルだと以下のようになる。インジェクションしてる部分に@EJBをつける。フィールドインジェクションでもいいけどLucyのサンプルをいかにそのまま動かすかということでセッターを使ってみた。

ページクラス

@Page("hello")
@Stateless
public class HelloPage {

    protected HelloService helloService;

〜省略〜

//    @Inject
    @EJB
    public void setHelloService(HelloService helloService) {
        this.helloService = helloService;
    }
}

インジェクトされるHelloサービスにも@Statelessをつけるだけ。

@Stateless
public class HelloServiceImpl implements HelloService {

	@Override
	public String hello() {
		return "Hello";
	}

}


とりあえずこれでT2がEJB対応となる。EJBは環境設定ファイルが一切いらない(使うことも出来る)ので数あるDIコンテナの中でもっとも扱いが容易だよね。トランザクション管理も無設定でいいし(^-^)b