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おいておきます。