@SessionScoped bean反复实例化

时间:2015-01-27 20:46:41

标签: jsf-2 primefaces

使用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);
    }

1 个答案:

答案 0 :(得分:2)

您应该使用正确的@SessionScoped导入等。 使用@ManagedBean,您需要javax.faces.bean。*,而不是javax.enterprise.context或javax.faces.view

另见Why are there different bean management annotations