我将 PrimeFaces 版本更新为 6.2。一切都很顺利,除了 CDI 对话管理的问题。
更新后,似乎对话在第一次访问页面时被初始化,但在第一次调用控制器之前它就丢失了。事实上,当访问一个页面时,一个新的对话就被初始化了(这是正确的)。但是在第一次调用控制器方法之后,会初始化一个新的对话,丢失之前的对话及其所有参数值。以下调用照常保持最后一次对话。
在 PrimeFaces 6.1(和之前的版本)中,这从未发生过。
这是一个错误还是我的缺乏?
访问页面后,显示的文字是“Init value with conversation id = 1”。
通过单击该按钮,显示的文本将更改为“Value set with conversation id = 2”。
以下点击保持 cid = 2。
控制器
@Named
@ConversationScoped
@LoggedIn
public class TestController implements Serializable {
static final long serialVersionUID = 69823746898775L;
@Inject protected Conversation conversation;
@Inject protected FacesContext facesContext;
rivate String outputValue;
@PostConstruct
public void init() throws IOException {
if (conversation.isTransient()) {
conversation.begin();
conversation.setTimeout(1800000);
}
outputValue = "Init value with conversation id = " + conversation.getId();
}
public void handleCall() {
outputValue = "Value set with conversation id = " + conversation.getId();
}
public String getOutputValue() {
return outputValue;
}
public void setOutputValue(String outputValue) {
this.outputValue = outputValue;
}
}
JSF 页面
<?xml version="1.0" encoding="UTF-8"?>
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui" contentType="text/html">
<html>
<h:head>
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="shortcut icon" type='image/x-icon' href='favicon.ico'/>
<ui:insert name="head" />
</h:head>
<h:body onload="javascript: if ('#{param.sessionExpired}'.length != 0) PF('loginDialog').show()">
<h:form id="testForm">
<p:commandButton action="#{testController.handleCall()}" value="Make a call" update="@form" />
<h:outputText value="#{testController.outputValue}" />
</h:form>
</h:body>
</html>
</f:view>