Seamからのインジェクション

追記(6/25):この記事は理解不足なまま書かれたものですので、参考にしないで下さい。



前にMVCをきっちり分けたフレームワークを作って開発していくつもり、みたいな事を書いたのですが、実際に検討していくうちにキレイに分けていくのはなかなか難しいなーと感じています。


たとえば@PersistentContextを付与してEntityManagerをインジェクションできるのはJSFから直接呼ばれたセッションBeanだけだったりします。実際にEntityManagerを使用するのはモデルなので、本来はモデルの中でインジェクションしたいところですが、それはできません。モデルは直接呼ばれていないのでSeamからのインジェクションはできないからです。

実際には、モデルがSeamコンポーネントである場合は文法的には処理を書けますが、インジェクションしたはずのEntityBeanはnullオブジェクトになるのでぬるぽで落ちる、というような動作になります。


なので、コントローラ側でインジェクションして、どこかでコントローラからモデルに渡してあげないとダメということになります。


モデルとコントローラをキレイに分けたいというのは理想ですが、Seamだけで完結させるような場合だと難しいようです。結果をDataModelに詰めてそれをJSFで表示する場合でも「O/RマッパーはSeamから切り出して他を使う」などとするとある程度思い通りになるかなと思います。