BeanManagerを取得する on 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時間