11

@ViewScoped一部の Web ページのバッキング Bean に対して、アプリケーションで - スコープを使用したいと考えています。また、CDI を使用して依存関係をバッキング Bean に注入します。

ただし、このように注釈が付けられたバッキング Bean を使用すると、

@ManagedBean
@ViewScoped

@Inject
someDependency (...)

注釈は@Inject何も注入せずNullPointerException、依存関係にアクセスするとすぐに取得します。

ただし、バッキングビーンを装飾すると

@Named
@ViewScoped


@Inject
someDependency (...)

注入は正常に機能しますが@ViewScoped、CDI / 溶接の一部ではないため無視されます。

@ViewScopedCDI Weld と併用するにはどうすればよいですか?

4

7 に答える 7

12

問題は、単純なマネージド Bean と CDI マネージド Bean を混在させていて、それらが連携しないことです。マネージド Bean は、Bean とその注入された Bean を定義するための単純なフレームワークです。CDIは、あらゆる種類の優れた機能を備えた別の獣です.

ただし、マネージド Bean は CDI インジェクション ポイントを使用できませんが、ViewScope を使用できますが、CDI Bean は CDI インジェクション ポイントとそのすべての優れた機能を使用しますが、ViewScope は使用できません。

この問題を解決するには、CDI を使用して Seam-Faces ライブラリを使用してビュー スコープを使用するか、CDI を削除して単純な実装である単純なマネージド Bean を使用する必要があります。

乾杯、

アンディ

于 2011-02-25T20:14:37.850 に答える
7

@javax.faces.bean.ViewScopedプロジェクトに Seam Faces 3.1.0 jar を含めることで作業を開始できます。

これに失敗した場合 (つまり、GlassFish 3.1.1 以前を使用している場合)、ViewContextExtension.java、ViewScopedContext.java、および javax.enterprise.inject.spi.Extension を Seam Faces 3.1.0 から独自のプロジェクトにコピーするだけで、 Seam Faces と同じパスをファイルに使用します。Java ファイルは逐語的にコピーできます。で終わる行を除くすべての行をViewContextExtensionjavax.enterprise.spi.Extension から削除する必要があります。

私は GlassFish 3.1.1 で後者の方法をうまく使用しており、GlassFish 3.1.2 がリリースされたら前者の方法を試してみます。

于 2012-01-02T13:20:49.367 に答える
1

いいえ、直接サポートされていません。Seam3は、CDI が提供しないエクストラを提供することになっています。見てみな。

于 2011-02-03T09:55:15.423 に答える
1

@NormalScope を実装して、他のフレームワークを使用したり、新しい JEE7 を待ったりすることなく、独自の CDI スコープを作成できます。

  • CDI は、各 Bean 呼び出しの後にAfterBeanDiscoveryイベントを発生させます
  • @Observesこのイベントに CDI 拡張機能を使用して、コンテキスト実装を追加できます。
  • スコープの実装では、次のことができます。
    1. Contextualを使用して、 FacesContext ViewRoot Mapから名前で Bean を取得し、各 ajax コールバックの後にそれを返します
    2. 最初のステップの Bean 名が見つからない場合は、CreationalContextを使用してFacesContext ViewRoot Mapに作成します

より詳細な説明については、次のリンクをお勧めします: http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/

于 2013-04-26T10:20:23.020 に答える
0

Seam は使用せず、通常の JSF + PrimeFaces のみを使用します。私はこれを見つけたので、試してみます...あなたもそうしたいかもしれません.

于 2011-07-26T12:15:16.480 に答える
0

Apache CODI または Seam 3 がこれを解決すると思います。これを行っている可能性がある DeltaSpike と呼ばれる新しいプロジェクトがあり、Seam 3 に続くと考えてください。

Java EE 7 では、すべての Bean が CDI Bean であることを理解しているため、この問題は解決されるため、JSF Bean はありません。

于 2013-04-20T23:16:02.497 に答える
0

Weld を Seam-Faces と組み合わせて使用​​すると実現できますが、壊れています。それに関する興味深いスレッドとそれに代わるものは、たとえばhttp://forum.primefaces.org/viewtopic.php?f=3&t=7585にあります。

于 2011-08-25T15:50:15.617 に答える