やっつけで。
まずは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