民意调查不适用于setted var

时间:2017-12-18 13:44:53

标签: jsf primefaces jstl ajax-polling

我想使用一个包含两个ManagedBeans的html页面。根据URL中的参数,我想通过JSTL变量设置bean名称。例如:

<c:set var="bean" value="#{webModule1}" scope="request" />

<c:set var="bean" value="#{webModule2}" scope="request" />

我的课程一直都在使用,所以肯定会有用:

@ManagedBean(name = "webModule1")
@ViewScoped
public class WebModule1 implements Serializable {

    protected WebModulesFormBean form;

    @PostConstruct
    public void init() {
        if (!firstInit()){
            this.form= new WebModulesFormBean();
        }
        //some code 
    }

    public void process() {
        if(this.form.isActive()){
            //some code
        }
    }
}  

新人:

@ManagedBean(name = "webModule2")
@ViewScoped
public class WebModule2 extends WebModule1 {
    public void process() {
        if(this.form.isActive()){
            //code with some changes
        }
    }
} 

此解决方案使用value属性和form in not null,例如:

<p:treeTable value="#{bean.form.root}" var="node" id="modulesTree">

但我对这段代码有疑问:

<p:poll listener="#{bean.process()}"  widgetVar="documentOutcome"  autoStart="#{bean.form.start}"   update="modulesTree"  async="false" 
            interval="1" id="myPoll2" />

调用侦听器时,会出现NullPointerException。 这个问题出现在所有p:民意调查中(我有几个),所以这不是方法代码的问题。 问题是&#39;形式&#39;是空的,虽然在开始变量&#39;形式&#39;已初始化,并在页面上显示treeTable。所以&#39;形式&#39;调用侦听器时,它开始为null。

谢谢!

1 个答案:

答案 0 :(得分:0)

我有一个解决方案!

问题在于: <c:set var="bean" value="#{webModule1}" scope="request" />

scope="request"是不够的,根据我的理解,这个范围意味着当调用poll时,会创建一个新的bean引用,并且form变量为null,因为它不是firstInit()

scope="view"是解决方案。

感谢您的评论!