通过FacesContext进行部分渲染时获取NullPointerException

时间:2014-11-04 10:56:52

标签: jsf jsf-2 primefaces

我有一个奇怪的行为,我在使用faces context进行页面刷新时获取NPE。 我有一个托管bean,它位于请求范围中。所以想在点击命令按钮后刷新页面。我试过'更新',但它在我的页面中表现得很奇怪。  错误:PartialViewContextImpl $ PhaseAwareVisitCallback.visit:java.lang.NullPointerException

这是我的JSF页面:

<h:form id="form">
                <p:messages autoUpdate="true"/>
                <h:panelGrid columns="4" cellpadding="5" id="panelGrid"  rendered="true">
                    <p:outputLabel for="s00" value="#{tk.expense_keyword}"/>
                    <p:inputText id="s00" value="#{expense.form.keyword}"/>
                    <p:outputLabel for="s02" value="#{tk.expense_creatorId}"/>
                    <p:inputText id="s02" value="#{expense.form.creatorId}" disabled="#{!expense.form.canEditCreatorId}"/>
                    <h:outputText id="s10" value="Amount Between #{expense.form.amountFrom} and #{expense.form.amountTo}" />
                    <h:panelGrid>
                        <p:slider for="s11,s12" display="s10" minValue="0" maxValue="1000" style="width: 200px" range="true" displayTemplate="Amount Between {min} and {max}" />
                        <h:inputHidden id="s11" value="#{expense.form.amountFrom}" />
                        <h:inputHidden id="s12" value="#{expense.form.amountTo}" />
                    </h:panelGrid>
                </h:panelGrid>
                <p:commandButton value="#{tk.expense_search}" id="a01" action="#{expense.search}" ajax="false" immediate="true"/>

                <p:dataTable var="line" varStatus="loop" value="#{expense.form.expenseEntryList}" emptyMessage="#{tk.expense_table_empty}" id="dataTable">
                    <p:column headerText="#{tk.expense_table_creatorId}">
                        <h:inputHidden value="#{line.oid}"/>
                        <h:inputText value="#{line.creatorId}"/>
                    </p:column>
                    <f:facet name="footer">
                        <p:commandButton value="#{tk.expense_saveAsDraft}" id="a06" action="#{expense.saveAsDraft}"/>
                        <p:commandButton value="#{tk.expense_submit}" id="a07" action="#{expense.submitAll}"/>
                        <p:commandButton value="#{tk.expense_validate}" id="a08" action="#{expense.validate}"/>
                    </f:facet>
                </p:dataTable>

            </h:form>

当我点击另存为草稿时,我想刷新页面。所以我使用FacesContext的方法来刷新页面。 这是我的方法saveAsDraft:

public Outcome saveAsDraft() throws Exception{

        try {
            saveAsDraftBody(false,false);
            getFacesContext().getPartialViewContext().getRenderIds().add("form:panelGrid");**//**getting error****
            getFacesContext().getPartialViewContext().getRenderIds().add("form:dataTable");**//**works fine****
            Log.info(this,"getFacesContext().getPartialViewContext().getRenderIds(): "+getFacesContext().getPartialViewContext().getRenderIds());
            return Outcome.SUCCESS;
        }
        catch (Throwable e){
            throw manageError(e);
        }

    }

我不知道为什么它适用于数据表刷新但不适用于panelGrid :(

1 个答案:

答案 0 :(得分:0)

首先,您在请求范围内拥有bean,并且您正在进行完整页面提交,这里部分渲染没有任何意义。你得到的错误,因为你有组件,基本上是表单的另一个输入,将在提交表单时发送到当前视图的托管bean。