SyntaxHighlighter

2011年1月20日木曜日

BeanManagerからManagedBeanを取得する

CDI(JSR-299)を利用すれば、ServletやJSFのManagedBean、EJBなどにコンテナがDIしてくれるけど、DIではなく、直接CDIで管理しているManagedBeanを取得する方法をメモしておきます。

これを知っていると、DIできないコンポーネントでManagedBeanを利用(例えば、JSFやJSPのスクリプトレット内)できたりします。

例として、以下のようなManagedBeanがあったとします。

package sample;
import java.util.Date;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@RequestScoped
@Named("test1")
public class TestBean1 {
 public Date getDate() {
  return new Date();
 }
}

これを以下のように取得する。

InitialContext ic = new InitialContext();
BeanManager manager =
  (BeanManager)ic.lookup("java:comp/BeanManager");

Set<Bean<?>> beans = manager.getBeans(
  TestBean1.class,
  new AnnotationLiteral<Default>() {});

Bean<?> bean = manager.resolve(beans);
TestBean1 obj = (TestBean1)manager.getReference(
  bean,
  TestBean1.class,
  manager.createCreationalContext(bean));

9行目のresolveは、5行目でBeanが1つに絞られているからできるのであり、もし絞られていないようであれば、5行目で取得したSet<Bean<?>>をQualifierやNameから要求にあったBeanを取得してgetReferenceを行えば良いです。

また、EL名で取得したい場合は、5行目を
Set<Bean<?>> beans = manager.getBeans("test1");
のようにすれば良いです。

0 件のコメント:

コメントを投稿