2

Weld または CDI の Conversation スコープを理解するのに問題がありました。

私のJSFファクレットページで私は呼び出します:

        <f:metadata>
            <f:event type="preRenderView" listener="#{viewBean.start}" />
        </f:metadata>

豆:

import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
@Named
@ConversationScoped
public class ViewBean implements Serializable {

@Inject
    private Conversation conversation;

public void start() {
    if (conversation.isTransient()) {
        System.out.println("START CONVERSATION");
        conversation.begin();

    }
}

ブラウザを更新するたびに、新しい会話が開始されます。それは正しい振る舞いですか?では、なぜ会話は常に一時的なものなのでしょうか? 例外はスローされません。beans.xml が作成され、空になります。

<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
4

1 に答える 1

5

簡単な回答: はい、これは正しい動作です。

長い答え: 会話は「作業単位」を表し、そのようなものは明示的に区別する必要があります。これは、conversation.begin() の明示的な呼び出しで行われます - 既に行っているように。複数のリクエストで同じ会話を使用したい場合は、それを伝播する必要があります-これはあなたがしていないことです:-)

会話を伝播すると、会話 ID が要求に追加されます。これにより、どの会話が必要かがコンテナに伝えられます。リクエストに会話 ID を指定せずに更新ボタンを押すと、リクエストごとに新しい会話が生成されます。

ドキュメントから:

会話コンテキストは、JSF Faces リクエスト (JSF フォーム送信) またはリダイレクトで自動的に伝播します。リンクを介したナビゲーションなど、faces 以外のリクエストでは自動的に伝播しません。

手動で伝播する必要がある場合は、会話 ID をリクエストに追加するだけです。

<h:link outcome="/addProduct.xhtml" value="Add Product">
   <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
</h:link>

以上のことについては、こちらで説明しています。

于 2011-03-30T17:02:03.043 に答える