次の会話スコープのバッキング Bean があります。
@Named
@ConversationScoped
public class TestConversation implements Serializable {
private Logger logger = LoggerFactory.getLogger(TestConversation.class);
private List<Integer> numbers;
@Inject
private Conversation conversation;
@PostConstruct
public void init() {
logger.info("Creating TestConversation bean!!!");
numbers = new ArrayList<Integer>();
numbers.add(3);
numbers.add(4);
numbers.add(5);
numbers.add(6);
conversation.begin();
}
public void commandLinkAction() {
logger.info("Invoking commandLinkAction");
}
public List<Integer> getNumbers() {
return numbers;
}
}
そして、次の facelets ビュー:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Testing Conversation</title>
</h:head>
<h:body>
<h:form>
<h:dataTable value="#{testConversation.numbers}" var="num">
<h:column>
<h:outputText value="#{num}"/>
</h:column>
<h:column>
<h:commandLink action="#{testConversation.commandLinkAction}">Trigger form submission</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
ページに入ると、INFO: Creating TestConversation bean!!!
どちらが正しいかがわかります。
しかし、次に をクリックするh:commandLink
と、次のように表示されます。
情報: TestConversation Bean を作成しています!!!
情報: commandLinkAction を呼び出しています
Bean が再度作成されました。これは、会話が伝搬されなかったことを意味します。これは次のことと矛盾すると思います。
ドキュメントからの引用:
JSF ビューをレンダリングするリクエストに関連付けられた長時間の会話コンテキストは、そのレンダリングされたページから発生するすべての Faces リクエスト (JSF フォーム送信) に自動的に伝播されます。
これを追加すると<f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>
、すべて正常に動作します。誤解がありますか?
PSなしでは、2回目f:param
にクリックすると正常に動作しますがcommandLink
、初めては動作しません:(。