SyntaxHighlighter

2011年1月20日木曜日

BeanManagerからManagedBeanを取得する

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

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

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

  1. package sample;  
  2. import java.util.Date;  
  3. import javax.enterprise.context.RequestScoped;  
  4. import javax.inject.Named;  
  5.   
  6. @RequestScoped  
  7. @Named("test1")  
  8. public class TestBean1 {  
  9.  public Date getDate() {  
  10.   return new Date();  
  11.  }  
  12. }  

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

  1. InitialContext ic = new InitialContext();  
  2. BeanManager manager =  
  3.   (BeanManager)ic.lookup("java:comp/BeanManager");  
  4.   
  5. Set<Bean<?>> beans = manager.getBeans(  
  6.   TestBean1.class,  
  7.   new AnnotationLiteral<Default>() {});  
  8.   
  9. Bean<?> bean = manager.resolve(beans);  
  10. TestBean1 obj = (TestBean1)manager.getReference(  
  11.   bean,  
  12.   TestBean1.class,  
  13.   manager.createCreationalContext(bean));  

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

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

0 件のコメント:

コメントを投稿