web-dev-qa-db-ja.com

@ManagedBeansは、CDI / Weldの@Namedが原因でJavaEE6で廃止されましたか?

CDI(およびその実装Weld)があるため、JEE6のすべてのPOJOには@Namedは、POJOをビューにアクセスできるようにします。

それは、ManagedBeansが完全に廃止されたことを意味しますか?または_@ManagedBeanはまだ理にかなっていますか?

41
Ingo Fischer

要するに、@ManagedBeanは、JSFを使用するがJSR 299を使用しない(理由が何であれ)アプリケーションにとって意味があります。ギャビンキングからのより長い説明の下に:

Re:JSF2の@ManagedBeanアノテーションとの比較?

Weldの例と古いWebBeansのドキュメントを見ると、新しい@ManagedBean JSF 2.0アノテーションと競合しているように見えます。どちらを使いたいかについての情報はありますか?

これは良い質問です。これまでに投稿された回答に完全に同意することはできません。

新しいEEマネージドBean仕様では、Java EEの基本コンポーネントモデルと、非常に基本的なコンテナサービスのセット(@Resource@PostConstruct@PreDestroy)が定義されています。

アイデアは、他の仕様(EJB、CDI、JSFおよび新しいJavaインターセプター仕様)で始まる)がこの基本コンポーネントモデルに基づいて構築され、トランザクション管理、タイプセーフの依存性注入などの追加サービスをレイヤー化することです。したがって、このレベルでは、マネージドBean、CDI、インターセプター、およびEJB仕様はすべて連携して機能し、非常に相補的です。

現在、マネージドBeanの仕様は、どのクラスがマネージドBeanであるかを正確に識別するという点で、非常に制限がありません。 @ManagedBeanアノテーションを1つのメカニズムとして提供しますが、他の仕様で異なるメカニズムを定義することもできます。したがって、たとえば:

  • EJB仕様では、EJB jarにデプロイされた@Statelessまたは@Statefulアノテーションを使用して特定のプログラミング制限に従うクラスはマネージドBeanであると述べています。

  • CDI仕様では、「Beanデプロイメントアーカイブ」にデプロイされた適切なコンストラクターを持つクラスはすべてマネージドBeanであると規定されています。

EJBとCDIがマネージドBeanを識別するための間違いなくより便利な方法を提供することを考えると、@ManagedBeanが何のために必要なのか正確に疑問に思うかもしれません。 Danがほのめかしたように、答えは、環境でCDIを使用できる場合(たとえば、EE6を使用している場合)、@ManagedBeanは実際には必要ありません。 @ManagedBeanは、CDIを使用せずにJSF2を使用している人が実際に使用するためのものです。

OTOH、Bean @ManagedBeanに注釈を付け、環境にCDIがある場合でも、CDIを使用してBeanにデータを注入できます。この場合、@ManagedBeanアノテーションはrequiredではないだけです。

要約すると、CDIを使用できる場合、JSF2が継承する@ManagedBean/@ManagedPropertyモデルよりもfar優れたプログラミングモデルを提供します。 JSF1。実際、EE 6 Webプロファイルは@ManagedPropertyなどのサポートを必要としないほど優れています。代わりに、CDIを使用するだけでよいという考えです。

51
Pascal Thivent

あなたには選択肢があります。 JSF2の@ManagedBeanを使用してBeanをフォームにバインドするか、CDIの@Namedアノテーションを使用します。 JSFのみを行う予定の場合は、@ ManagedBeanを使用できますが、EJBと統合する場合、またはCDIの@ConversationScopedを利用する場合は、CDIルートに進みます。

個人的には、JSFの次のバージョンで@ManagedBeanを廃止し、CDIで標準化する必要があると感じています。二元性は初心者を混乱させます。

15
Brian Leathem

ビューの概念がない であるため、CDIにはビュースコープがありません。したがって、そのスコープが必要な場合、CDIの純粋な形式ではそれを行うことができません。ビュースコープとは、基本的に リクエストスコープ+ AJAX対応 を意味します。 JSF xyz.xhtmlなどが表示されていても、それはnot<f:viewParam>という名前のページのようなJSFビューです。ビュースコープのBeanでよく使用されるのは GETパラメータをそのようなBeanに取得する方法 です。また これを読む

CDIは、JSF /プレゼンテーション層ではなく、EJB /サービス層に存在することに注意してください。 このブログ は素晴らしい概要を持っています。

そのため、@ManagedBeanをCDIで完全に置き換えることはできません。@ViewScoped Beanを使用している場合、少なくとも CDIの拡張 を使用していないか、または Seam 3 Facesを使用していない場合)モジュール 。 RichFaces、PrimeFaces、IceFacesなどのAJAX化されたJSF 2ベースのGUIツールキットを使用する場合、ビュースコープBeanの使用はほとんど常に発生します。

間違ったJava EE 6パッケージからの注釈を混在させると(= /// =)can予期せぬ問題が発生します。RichFacesまたは同様のAPIを使用している場合も同様です:

@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped

使用されるコンポーネント用ですsolelyプレゼンテーション層で、ここではRichFaces、PrimeFacesなど。一部のリッチコンポーネント CDIアノテーション付きおよびJSFアノテーション付きヘルパーBeanに問題があるようです 。 Bean(または何もしないように見えるBean)から奇妙な動作が発生した場合、間違った注釈の組み合わせが原因である可能性があります。

のようなJSFとCDIの混合

@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped

jSFページから参照すると、可能であり、ほとんどの場合に機能しますが、あまり知られていない問題や欠点があります。 when CDIにないJSFスコープを使用

また、@Named @ViewScopedの組み合わせは意図したとおりに機能しません。 JSF固有の@ViewScopedは、JSF固有の@ManagedBeanとの組み合わせでのみ機能します。 CDI固有の@Namedは、このように@RequestScopedのように動作します。 @ManagedBeanの代わりに@Namedを使用するか、@ConversationScopedの代わりにCDI固有の@ViewScopedを使用してください。

その後

@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped

jSFページAFAIKから直接参照されるCDI Beanに使用できます。これまでのところ、上記の組み合わせに問題はなかったので、ここで@ManagedBeanは廃止されていると考えることができます。

残っているのはサービス層です。ここでは主にトランザクションEJBサービスBeanとして宣言されています。

@javax.ejb.*

ほとんどは@ javax.ejb.Statelessです。このデザインが望ましいかどうかはわかりませんが、注釈を付けて JSFページから直接EJBBs を使用することもできます。 @ javax.ejb。*で注釈されたコンポーネントを参照(挿入)する。 @Stateless@Injectよりも@EJBを優先してください ここで説明 。 (おそらくこの答えの祖先...)

最後に、Java EE 6アノテーションの非常に素晴らしい概要はここにあります: http://www.physics.usyd.edu.au/~rennie/javaEEReferenceSheet.html

Note:上記の情報は専門家からのものではなく、単にこれについての新規参入者の観点からの私自身の見解/見方途方もなく混乱するJava EE 6アノテーションspaghetti。これ以上の洞察はまだ開発されていません。元の質問のコンテキストでは少し行き過ぎたとしても、この回答がこの混乱に対する一般的で実用的な回答であると思います。

10
Kawu

Weld Reference (p。12)で読んだとおり、@ ManagedBeanは不要になりました。

Beanクラス@ManagedBeanに注釈を付けることにより、マネージドBeanを明示的に宣言できますが、CDIでは必要ありません。仕様によれば、CDIコンテナーは、次の条件を満たすクラスを管理対象Beanとして扱います。

  • 非静的な内部クラスではありません。これは具象クラスであるか、@ Decoratorアノテーションが付けられています。
  • EJBコンポーネントを定義するアノテーションが付いていない、またはejb-jar.xmlでEJB Beanクラスとして宣言されていない。
  • Javax.enterprise.inject.spi.Extensionは実装していません。
  • 適切なコンストラクターがあります。
  • クラスにパラメーターのないコンストラクターがある、または
  • クラスは@Injectアノテーションが付けられたコンストラクターを宣言します。
7
Ingo Fischer