【问题标题】:Getting a NullPointerException while Partial rendering via FacesContext通过 FacesContext 进行部分渲染时获取 NullPointerException
【发布时间】:2014-12-31 05:46:08
【问题描述】:

我有一个奇怪的行为,我在使用面部上下文进行页面刷新时得到 NPE。 我有一个在 Request Scope 中的托管 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 :(

【问题讨论】:

  • 在此处发布您的完整堆栈跟踪。我不禁注意到您实际上并没有打印原始堆栈跟踪,而是重新抛出异常。您还希望最小化该面板网格中的内容,删除特殊的render="true",以缩小您的关注范围

标签: jsf jsf-2 primefaces


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 2015-04-30
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多