読者です 読者をやめる 読者になる 読者になる

BeanManagerを取得する on Weld, Tomcat

CDI Weld Tomcat

Weld 2.3.1 + Jersey2.22.1
Tomcat8

発端はEntityに登録者IDや更新者IDを埋め込みたかったが、Entityで@SessionScopedなBeanを@Injectできなかったから。
EntityListener使ってみたり紆余曲折あったが、時間が無いので経過は省くとして結局BeanManagerを取得して直接Beanを取ってくることに。

参考その1:CDIのBeanManagerを使う - CLOVER

InitialContext ic = new InitialContext();
BeanManager bm = (BeanManager) ic.lookup("java:comp/BeanManager");
Set<Bean<?>> beans = bm.getBeans(SessionDto.class);
Bean<?> bean = bm.resolve(beans);
SessionDto sessionDto = (SessionDto) bm.getReference(bean, SessionDto.class, bm.createCreationalContext(bean));
// SessionDtoが@SessionScopedなクラス

これではlookup()するところでNamingExceptionになってできず。
おそらくTomcatで動かしているからだと思われる。

参考その2:jsf - BeanManager on Apache Tomcat 7.0.47 cannot create resource instance - Stack Overflow
Tomcatの場合、"java:comp/BeanManager"ではなく"java:comp/env/BeanManager"でlookupするとある。
確かにTomcatでDataSourceをlookupする時は"java:comp/env/・・・"で見に行く。
あとcontext.xmlにもResourceを追加する。

 <Resource name="BeanManager"
        auth="Container"
        type="javax.enterprise.inject.spi.BeanManager"
        factory="org.jboss.weld.resources.ManagerObjectFactory" />

で、どうにかSessionDtoが取れた。
紆余曲折時間:約2時間