2

どうすれば CDI で新しい会話を開始できるのだろうと思いました。cid 要求パラメーターがない場合、コンテナーは新しい会話を開始するように見えますが、コントローラーから明示的に新しい会話を開始したい場合があります。

例: JSF ページを使用して、会話スコープのコントローラー Bean によるエンティティ保持を編集します。ajax リクエストが送信され、コントローラーのメソッドが呼び出されてイベントが発生し、新しい会話内の別のコントローラーで編集する必要があるサブエンティティが渡されます。その問題の解決策が見つかりません。私はすでに Apache Myfaces CODI を調べましたが、その問題を解決するパターンも見つかりません。

それから私を助けてください。

[編集] Ok。たぶん、私は問題を十分に詳しく説明していませんでした。もう一度試してください: 異なる (新しい) 会話 ID を持つ「同じ」会話スコープのコントローラー Bean の新しいインスタンスにアクセスしたい場合。それはどのように機能しますか?あなたが持っている画像..言ってみましょう.. 1つの Order エンティティを編集するための OrderControllerBean 。このコントローラーには、public void createSubOrder() のような JSF アクション メソッドがあります。このメソッドは、新しい Order を作成し、それを使っていくつかの凝った処理を行う必要があります。その後、別の会話 ID を持つ新しい OrderControllerBean インスタンスに渡す必要があります。おそらくCDIイベントを使用して。関係ない。問題は、OrderControllerBean が会話に既に存在することです。現在の注文を編集するために使用されます。そのため、作成したばかりのサブオーダーの作成および編集には使用できません。では、OrderControllerBean の新しいインスタンスを作成するにはどうすればよいでしょうか? たぶん、これはこれを行う正しい方法ではありません。しかし、これまでのところ、空白のcidパラメーターを使用してブラウザーを新しいURLに送信せずに、新しい会話を作成する別の可能性を見つけることができません. しかし、これらの会話の間で情報を交換することはできません。会話 1 で作成された非永続的な注文を、会話 2 の同じコントローラーに移動するにはどうすればよいですか? 私の問題は、会話の会話についてです。会話 1 で作成された非永続的な注文を、会話 2 の同じコントローラーに移動するにはどうすればよいですか? 私の問題は、会話の会話についてです。会話 1 で作成された非永続的な注文を、会話 2 の同じコントローラーに移動するにはどうすればよいですか? 私の問題は、会話の会話についてです。

[編集] ドキュメント全体と、これまでに付属しているすべての例を読みました。これらのステートメント (http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#conversationcontext) によると、CDI 会話は JSF と密接に結びついているようです。残念ながら、技術的な詳細を詳しく説明しているドキュメントは見つかりません。新しいリクエストを送信して新しい会話を取得する方法は他にないため、新しい会話がいつどのように開始されるかについてのロジックをビュー レイヤーで直接保持する必要があります。それは間違いなく私が想像できる最善の方法ではありません。私の次の試みは Seam 3 の評価です。なぜなら、Seam 2 には @Begin および @End アノテーションがあり、会話をより詳細に制御できるようになったことを覚えているからです。会話の伝播を指定できるタグ ライブラリもいくつかありました。他の誰も私のような質問をしていないのはなぜだろうと思っています。現時点では、CDI が複雑なプロジェクトにあまり普及していないか、または物事がどのように機能するかを理解するのに大きな問題があります。これまでのところ、単純なデモ以上の CDI/CODI の例を見つけることができません。使用されているポータブル拡張機能に関係なく、会話の高度な使用を示す例へのリンクを誰かが持っている場合は、お知らせください。

4

3 に答える 3

2

CODI を使用すると、Bean の会話が自動的に開始されます。アクセスするとすぐに。また、複数の会話を並行して行うことができます。標準 CDI の会話は、CODI の Window-Scope に似ています。しかし、ここでも CODI の方がはるかに優れています。

標準 CDI の対話には #begin が必要ですが、これは検証エラーなどの場合に問題になります。この場合、Bean を何度も作成します。std の使用をやめました。1 日デモよりも複雑なアプリの多くの場合、完全に壊れているため、2 週間後の CDI 会話。http://os890.blogspot.co.at/2011/04/slides-codi-conversations.htmlを見つけたので、CODI チームが独自の CDI スコープを作成した理由を理解するのに役立ちました。

また、あなたが説明したことは、CODIを使用すると簡単です。

[編集]: 「編集」に追加したものは、2 番目の Bean がないとまったく機能しませんが、新しいウィンドウ ID を取得することはありません。会話スコープ Bean の新しい (/restarted) インスタンスが必要な場合は、次を使用できます。 org.apache.myfaces.extensions.cdi.core.api.scope.conversation.Conversation#restart controller#getXyz controller#restart (それ自体で Conversation#restart を呼び出します) のようなものと、controller#setXyz のようなものです。ただし、あなたがやろうとしていることは非常に汚いように聞こえます。

于 2012-12-08T00:00:46.917 に答える
0

「イベントの発砲」とはどういう意味ですか。JSF、ajax、CDIイベント?
なぜあなたはあなたのサブエンティティのために新しい会話を始めたいのですか?
どういうわけか、cidを添付せずにクライアントにサブエンティティ編集ページをリクエストする必要があると思います。サブエンティティのコントローラーが新しい一時的な会話を取得するようにします。@PostConstructその後、そのメソッドで開始できます。同じリクエストで新しい会話を開始(または再開)することはできません。

于 2012-12-07T19:48:31.057 に答える
0
   @Inject
   private Conversation conversation;

conversation.begin();
conversation.end();

これをグーグルするのはかなり簡単ですか?問題は正確には何ですか?

于 2012-12-07T18:13:01.490 に答える