由于未初始化的托管Bean属性,JSF 2 ProcessValidationPhase失败

时间:2012-08-28 00:09:59

标签: spring jsf-2

我正在寻找有关如何实施以下内容的最佳实践指南。我使用的是JSF2,Spring 3,PrimeFaces 3.3,MyBatis。

需要量:

我有一个数据输入屏幕,其输入字段链接到VO对象,这是托管bean上的属性。用户可以创建新记录,也可以搜索要编辑的现有记录。

当选择编辑现有记录选项时,会出现一个对话框,用户可以在其中搜索和检索可供选择的潜在记录列表。

他们一次只能选择一个记录进行编辑。完成选择后,对话框将关闭,VO对象将填充所选数据,供用户编辑。

问题:

当提交搜索表单以检索潜在记录列表以进行编辑时,VO对象尚未初始化并导致ProcessValidationPhase使“目标无法访问”失败。

实施此方案的最佳方法是什么?是否应在托管bean中使用空值初始化VO对象?或者,在托管bean初始化期间调用的VO对象上是否应该有一个初始化方法?

DataEntry.XHTML

主要数据输入字段:

            <p:panelGrid id="dataEntry">
                <p:row>
                    <p:column style="width:200px;">
                        <h:outputLabel value="Field 1:"/></p:column>
                    <p:column>
                        <p:inputText value="#{managedBean.dataEntryVo.field1}"
                                     style="width:50px;"
                                     disabled="true"/>
                    </p:column>
                </p:row>

                <p:row>
                    <p:column>
                        <h:outputLabel value="Field 2:"/>
                    </p:column>
                    <p:column>
                        <p:inputText value="#{managedBean.dataEntryVo.field2}"
                                     style="width:50px;"
                                     disabled="true"/>
                    </p:column>
                </p:row>

            </p:panelGrid>

对话框上的命令按钮,用于检索可供选择的记录列表进行编辑:

            <p:commandButton id="retrieveDataCb"
                            value="Retrieve"
                            actionListener="#{managedBean.retrieveDataEntryList}"
                            update=":dataEntryForm:retrievedList">
            </p:commandButton>

非常感谢

1 个答案:

答案 0 :(得分:0)

将搜索条件初始化为虚拟对象肯定会有效。不是很整洁,但它的工作原理。另一方面,您可以尝试使用数据容器组件,如<p:dataGrid/><p:dataTable/>。有一个var属性可以让你通过空引用来逃避,就像你想要实现的情况一样。 var属性会补偿空数据集。话虽这么说,你现在可以在你的支持bean中有一个List<DataEntryVo>,然后在你的视图中:

<p:dataGrid id="dataEntry" value="#{managedBean.theVoList}"  var="vo">
            <p:panel>
               <p:panelGrid>
                <p:column style="width:200px;">
                    <h:outputLabel value="Field 1:"/>
                </p:column>
                <p:column>
                    <p:inputText value="#{vo.field1}" style="width:50px;" disabled"true"/>
                </p:column>
                  <p:row>
                <p:column>
                    <h:outputLabel value="Field 2:"/>
                </p:column>
                <p:column>
                    <p:inputText value="#{vo.field2}" style="width:50px;" disabled="true"/>
                </p:column>
                </p:row>
                </p:panelGrid>
            </p:panel> 
           </p:dataGrid>

另一种方法是,您可以避免将输入字段完全绑定到托管bean中的对象,而是将输入字段直接绑定到托管bean,就像在<p:inputText binding="#{vo.field1Input}" style="width:50px;" disabled="true"/>中一样,在您的支持bean中,您将拥有{{1 (或者类是什么类的primefaces然后根据你的需要调用UIcomponent field1Input = new HtmlInputText();field1Input.getValue()。这也是一个好主意,让你的bean成为一个ViewScoped bean,以避免不必要的麻烦让这个解决方案工作