nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

WildFly で StereoType に CDI Scope を指定しても上手く認識してくれない件を調べる

関西WildFly 8(旧JBoss AS)勉強会でも話題になった、WildFly で StereoType に CDI Scope を指定しても上手く認識してくれない再現ケースのエントリをおださんが書いてくれたので30分ほど調べてみました。

再現ケースは今のところLogic.classのパッケージングを忘れてるのでClasssNotFoundしますがそれは簡単に直せるのでスルーします。

https://github.com/OdaShinsuke/wildflytest

問題のトリガーはimplicit bean archiveかexplicit bean archiveかの違いで発生しています。つまり、空のbeans.xmlを入れると挙動が変わり、テストがパスするようになります。会場でぼくのほうは問題なく動いたのはこの点の違いからです。

implicit bean archiveではInjectされるBeanにscope定義が必須となっています。これはデフォルトscopeを定義しているStereoTypeでも良さそうな気がしますが、WildFlyは現状そうはなっていないようです。たぶんWildFlyのバグだと思いますが、あとで確認してみます。WildFly 9でも今のところ8と同じ動作です。

CDI 1.1では上記「scope定義が必須」というような条件をまとめた"bean defining annotation"がなんであるのか明確な記述がないのですが、CDI 1.2では明確に記述されておりStereoTypeも含まれているので、バグということでよさそうです。

バグとして登録しました。 WFLY-3774 CDI bean with StereoType is not injectable in implicit bean archive 急ぎでもないですし担当している開発者のほうがサクッと修正できるはずなので開発者にまかせます。

追記: 9/1時点でWildFly 9 masterビルドしたらなおってました。開発者と認識合わせしたんですが、CDI 1.1仕様を字面通り解釈するとScopeアノテーションのみCDI Beanと認識される、と記述されているので、StereoTypeはやはりCDI 1.2から認識されるという挙動で正しいし、CDI 1.2からこの不便な点は改善されている、ということでよさそう。