Использование PrimeFaces 5.10, JSF 2 и Wildfly, я пытаюсь заставить мою страницу xhtml взаимодействовать с одним экземпляром компонента @SessionScoped с компонентом опроса PF. Каждый раз, когда опрос вызывает метод bean, создается новый экземпляр bean-компонента. Я пробовал @ViewScoped и @SessionScoped без изменений в поведении. Я заметил другие подобные вопросы, но не видел никаких решений, которые я смог реализовать.@SessionScoped bean, созданный снова и снова
Я знаю, что println не является надежным способом отображения порядка вызовов методов, но я использую их, чтобы просто продемонстрировать, какие методы вызывают, и кажется, что метод init() вызывается снова и снова, даже хотя у меня есть @PostConstruct, поэтому это новые экземпляры. Я даже распечатываю «это», и каждый раз он печатает разные хэши.
Он никогда не проходит через оператор if в refreshTweets(), потому что поле 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>
Соответствующий код боб ниже:
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);
}
Просто, чтобы быть уверенным (поскольку вы их не публиковали), но у вас есть правильный импорт SessionScoped и т. Д.? С помощью @ManagedBean вам нужны javax.faces.bean. * Те, которые не являются javax.enterprise.context или javax.faces.view – Kukeltje
Хахаха, который научит меня быстрее вводить текст на свой телефон или использовать короткие комментарии ;-) – Kukeltje
Я изменил импорт, как было предложено, и он больше не создает экземпляр компонента несколько раз. У меня все еще есть проблема с функциональностью компонента, но я подозреваю, что это короткое замыкание между стулом и клавиатурой, поэтому ... Спасибо! Итак, кто-то хочет дать ответ, чтобы я мог назначить лучший ответ? – Brooks