1

私は CDI 会話スコープを使用していますが、ユーザーが通常のシナリオに従えば問題ありません。ただし、ユーザーが「会話」を完了しないと、次のエラーが発生します。

WELD-000214 Attempt to call begin() on a long-running conversation

明らかに、endメソッドを呼び出さずにbeginメソッドを2 回呼び出すためです。

それを明確にするために、これは私のシナリオです:

  • 最初のページで、ユーザーは参照番号で製品を検索します。見つかった場合は、 conversation.beginを呼び出して、製品の詳細ページに移動します。
  • このページで、ユーザーが保存ボタンを押すと、この時点でconversation.endを呼び出します。

問題は、ユーザーが除外する詳細ページにいるとき (たとえば、メニュー内のリンクをクリックしたとき) であるため、endメソッドが呼び出されないことです。そして、検索ページに戻ると、 beginが再度呼び出されるため、エラーが発生します。

考えられる解決策の 1 つは、ユーザーが 2 ページ目に存在するときにendメソッドを呼び出すことです。しかし、これを達成する方法がわかりません。

(私はJSF 2.1を使用しており、CDIのWeld 1.1.6実装を使用しています)

前もって感謝します

4

2 に答える 2

3

この動作は意図的なものです。conversation.isTransient()会話を長時間実行する必要があるかどうかを簡単に確認して決定できます。

begin() が呼び出され、現在の会話が既に長期実行としてマークされている場合、IllegalStateException がスローされます。

仕様はこちら

于 2012-04-24T18:08:49.633 に答える
2

isTransient() メソッドを使用して終了した会話は、常に最初に会話チェックを開始します。

public void beginConversation(){
    if (!conversation.isTransient()){
        conversation.end();
    }
    conversation.begin();
}
于 2016-06-17T10:20:08.333 に答える