2015-01-27 4 views
1

Использование 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); 
    } 
+0

Просто, чтобы быть уверенным (поскольку вы их не публиковали), но у вас есть правильный импорт SessionScoped и т. Д.? С помощью @ManagedBean вам нужны javax.faces.bean. * Те, которые не являются javax.enterprise.context или javax.faces.view – Kukeltje

+0

Хахаха, который научит меня быстрее вводить текст на свой телефон или использовать короткие комментарии ;-) – Kukeltje

+0

Я изменил импорт, как было предложено, и он больше не создает экземпляр компонента несколько раз. У меня все еще есть проблема с функциональностью компонента, но я подозреваю, что это короткое замыкание между стулом и клавиатурой, поэтому ... Спасибо! Итак, кто-то хочет дать ответ, чтобы я мог назначить лучший ответ? – Brooks

ответ

Смежные вопросы