DomaのEJB3.1対応

Domaは、これまで、コンストラクタインジェクションが使えるDIコンテナと連携する機能を持っていましたが、コンストラクタインジェクションがサポートされていないEJB3.1とは連携が難しい状況にありました。次のバージョン(1.20.0)で連携しやすくしたいと思います。需要があるかどうかはわからないのですが、自分が使ってみて必要性を感じたので。

使い方ですが、こんな感じになります。
まず、Daoのインタフェースにはこう書きます。@AnnotateWithがポイント。

@Dao(config = DomaConfig.class)
@AnnotateWith(annotations = { @Annotation(target = AnnotationTarget.CLASS, type = Stateless.class) })
public interface TodoDao {
   ...
}

上記のインタフェースがDomaのaptで処理されて次のような実装クラスのコードが生成されます。@Statelessが注釈されるのがポイント。

@javax.ejb.Stateless()
@javax.annotation.Generated(value = { "Doma", "1.20.0-SNAPSHOT" }, date = "2011-11-13T23:54:03.979+0900")
public class TodoDaoImpl extends org.seasar.doma.internal.jdbc.dao.AbstractDao implements example.todo.TodoDao {
    public TodoDaoImpl() {
        super(new example.config.DomaConfig());
    }
...
}

DomaConfigの中では、JNDIでデータソースをとってくるようなコードを書けばいいでしょう。

public class DomaConfig extends DomaAbstractConfig {
    @Override
    public DataSource getDataSource() {
        try {
            return InitialContext.doLookup("jdbc/todo");
        } catch (NamingException e) {
            throw new RuntimeException(e);
        }
    }
...
}

フィールドインジェクションは次のように書けます。@EJBのbeanInterfaceにインタフェースのクラスを指定するのがポイント。

@Path("/todo")
@Stateless
public class TodoController {
    @EJB(beanInterface = TodoDao.class)
    protected TodoDao todoDao;
...
}


SNAPSHOTおいておきます。


最近GlassFishを試しているんですが、EJB3.1を使うのはお手軽ですね。