質問: Java EE6のManaged Beanって何なのかモヤモヤしています。 例えば、下記のようにJAX-RSアノテーション@Pathをつけた Beanのことでしょうか? ``` @Path("/book") public class BookResource{ ~~ メソッドなどは省略 ~~ } ``` それとも下記のようにCDIのアノテーション javax.enterprise.context.RequestScopedをつけた Beanのことでしょうか? ``` @Path("/book") @RequestScoped public class BookResource{ ~~ メソッドなどは省略 ~~ } ``` おそらく今回モヤモヤしていることの答えはThe Java EE 6 Tutorial か Java EE 6 Technologies に 記載されてると思い込んでますが見つけることができていません。 ### 質問に至る背景 現在、Java EE6でRest Webサービスを作成しています。 下記2つのチュートリアルを参考にしました。 1. Integrating JAX-RS with EJB Technology and CDI 2. Using Interceptors in CDI Applications 上記チュートリアルよりJavaEE6ではJAX-RSとCDIは 組み合わせてつかえると理解しました。 この結果、下記のようなコードになりました。 (@DefaultProcessアノテーションは自作したものです。) ``` @Path("/book") @RequestScoped @DefaultProcess public class BookResource{ @Inject BookResourceService ts; ~~ メソッドなどは省略 ~~ } ``` 上記のコードはBookResourceクラスにたいして下記手順でアノテーション付与し作成しました。 (BookResourceクラスは質問のためのサンプルクラス) ##### BookResourceクラス作成手順 1. JAX-RSのアノテーション@PathをつけてBookResourceクラスをJAX-RSのビーンにする。 2. CDIアノテーション@RequestScopedをつけてCDIビーンにする。これにより、@InjectでコンテナからEJBをインジェクト可能。 3. 上記のチュートリアル(Using Interceptors in CDI Applications)を参考にInterceptors関連の設定(bean.xml)、Interceptor関連のクラスとアノテーションを作成。ここで作成したアノテーションは@DefaultProcess。 4. 3で作成したアノテーション@DefaultProcessをBookResourceクラスに付与。 ##### BookResourceクラス動作確認結果 Embedded GlassFish All In One 3.1.1 で動作すること確認できました. ##### BookResourceクラス動作確認後もモヤモヤしていること チュートリアル(Using Interceptors in CDI Applications)に記載のIntercepterが なぜ動作するのかモヤモヤしています。 私の解釈では @RequestScopedアノテーションを付与してBookResourceクラスが Managed Beanというものになったため、Intercepterの仕組みが動作するように なったのだと思っています。
回答: チュートリアルなど利用されているので、お調べ済みかも知れませんが。 ManagedBeanはJ2EEの頃からJSFとセットで実装されており、CDIはJavaEE6からの実装となる後発の機能です。勉強不足なのでCDIがManagedBeanの完全なサブセットとなるのかは知らないのですが、アノテーションは共通のものが多く、誤り混在してしまう恐れもあるようです。 JavaEE6アノテーションの使い分けについて 過去資産を利用するのでは無く、最新環境で開発を始めるのであればCDIで始められたら良いかと思います。TipsがManagedBeanのものであれば、CDIに読み替えれば通常は使えるのではないかと思います。CDIでもIntercepterは使用できます。 最初の質問の「どちらがManagedBeanか?」に関しては、下段のソースが近いですがインポート部が異なります。 ``` package beans; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean @RequestScoped public class NewClass { } ``` 以上、私見を書いてきましたが以下のサイトが分かり易いかもしれません。 ManagedBeanの行方 ご参考までに。