使用PrimeFaces 5.10,JSF 2和Wildfly,我试图让我的xhtml页面与带有PF poll组件的@SessionScoped bean的单个实例进行交互。每次轮询调用bean方法时,都会创建一个新的bean实例。我已经尝试过@ViewScoped和@SessionScoped而没有改变行为。我已经注意到其他类似的问题,但是没有看到任何我能够实现的解决方案。
我知道println不是显示方法调用顺序的可靠方法,但是我使用它们只是为了演示调用哪些方法而且看起来init()方法被调用了一遍又一遍,即使我有@PostConstruct,所以它是新的实例。我甚至打印出来"这个"并且它每次打印时都会显示不同的哈希值。
它永远不会通过refreshTweets()中的if语句,因为stopPolling字段永远不会在正确的上下文中设置为false。
我之前遇到过这个问题,并且能够解决它而不是解决它。如果有人对我做错了什么有任何想法,请告诉我。
以下是相关的xhtml代码:
<p:layoutUnit id="center" position="center" styleClass="dataBox">
<h:form id="TwitterFeed">
<p:panelGrid columns="2">
<p:outputLabel value="Twitter topic to query: " />
<p:inputText value="#{dataBean.tweetTopic}"/>
<p:outputLabel value="Number of Twitter Results: " />
<p:inputText value="#{dataBean.tweetCount}" />
<p:commandButton value="Submit" action="#{dataBean.toggleRenderTweets}" update="tweets"/>
<p:commandButton value="Polling" action="#{dataBean.togglePolling}" update="tweets"/>
</p:panelGrid>
<p:panel visible="#{dataBean.renderTweets}" id="tweets">
<p:panelGrid columns="1">
<p:dataTable id="twitterTable" value="#{dataBean.tweetList}" var="tweetStatus">
<p:columns value="#{dataBean.tweetColumns}" var="column" columnIndexVar="colIndex">
<f:facet name="header">
<h:outputText value="#{column.header}"/>
</f:facet>
<h:outputText value="#{tweetStatus[column.property]}"/>
</p:columns>
</p:dataTable>
<p:poll interval="10" listener="#{dataBean.refreshTweets}" update="twitterTable" widgetVar="tweetPoll" id="tweetPoll" autoStart="true"/>
</p:panelGrid>
</p:panel>
</h:form>
</p:layoutUnit>
相关的bean代码如下:
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.annotation.PostConstruct;
import java.io.Serializable;
@SessionScoped
@ManagedBean
public class DataBean implements Serializable {
private List<TwitterStatusModel> tweetList;
private boolean renderTweets;
private boolean stopPolling;
@PostConstruct
public void init() {
<<initialize fields>>
stopPolling = true;
System.out.println(this + " init()");
}
private void getTweets() {
<<this method sets the List above tweetList>>
}
public void refreshTweets() {
if (!stopPolling) {
<<Method never passes the if statement because stopPolling is set to true in init()
}
public void togglePolling() {
stopPolling = !(stopPolling);
System.out.println(this + "Toggling polling - now " + stopPolling);
}
答案 0 :(得分:2)
您应该使用正确的@SessionScoped导入等。 使用@ManagedBean,您需要javax.faces.bean。*,而不是javax.enterprise.context或javax.faces.view