以前のエントリにて、「RESTEasyを使ったアプリでセッションBeanがうまくDIできない」件、改めて考えるとできるのでは?という説。
まずEJB3上でのDIのルールと、SeamでのDIのルールについて整理。
- EJB3のDIの適用範囲はEJB3のみ(ここでいうEJB3というのは、@Stateful、@Statelessなりのアノテーションが作ったセッションBeanで、ビジネスロジックを記述したもの)
- Seamを使うとDIの適用範囲をSeamコンポーネントであれば任意のオブジェクトにできる(ここでいうSeamコンポーネントというのは、@Nameアノテーションが付与されたPOJO)。つまりユニークなvalueをもつ@Nameをつけたオブジェクト同士なら、自由にDIができる。
先の件だと、@EJBをつけてインジェクションしたければ、インジェクション先のオブジェクト(リクエスト処理をするRESTEasy用のBean)もEJB3である必要があるのだけど、実はそうしていなかったのでは、という話。
別の方法では、インジェクション先のオブジェクトにもセッションBeanにも@NameをつけてSeamコンポーネント化する方法でも多分できそう。
ただ今回、アプリ用のプロジェクトとロジック用のプロジェクトがばっさり切れていて、ロジック用のプロジェクトの方はseamライブラリに依存させたくないので、この方法は見送り。