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

Spring 由于未初始化托管Bean属性,JSF 2 ProcessValidationPhase失败,spring,jsf-2,Spring,Jsf 2,我正在寻找关于如何实施以下内容的最佳实践指导。我正在使用JSF2、Spring3、PrimeFaces3.3和MyBatis 要求: 我有一个数据输入屏幕,输入字段链接到VO对象,它是托管bean上的一个属性。用户可以创建新记录,也可以搜索要编辑的现有记录 选择“编辑现有记录”选项后,将出现一个对话框,用户可以在其中搜索和检索要从中选择的潜在记录列表 他们一次只能选择一条记录进行编辑。完成选择后,对话框将关闭,VO对象将填充所选数据,供用户编辑 问题: 当提交搜索表单以检索要编辑的潜在记录列表时

我正在寻找关于如何实施以下内容的最佳实践指导。我正在使用JSF2、Spring3、PrimeFaces3.3和MyBatis

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

选择“编辑现有记录”选项后,将出现一个对话框,用户可以在其中搜索和检索要从中选择的潜在记录列表

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

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

实现此场景的最佳方式是什么?VO对象是否应该在托管bean中用空值初始化?或者应该在托管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>


非常感谢

将搜索条件初始化为虚拟对象肯定会起作用。不是很整洁,但很管用。另一方面,您可以尝试使用数据容器组件,如
。有一个
var
属性,可以让您避开空引用,就像您试图实现的情况一样。
var
属性补偿空数据集。话虽如此,您现在可以在支持bean中拥有一个
列表,然后在视图中:

<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,就像在
中一样,在支持bean中,您将拥有
UIcomponent field1Input=new HtmlInputText()
(或primefaces的任何类,然后调用
field1Input.getValue()
field1Input.setValue()
根据您的需要。将您的bean设置为可视范围的bean也是一个好主意,以避免不必要的麻烦,从而使此解决方案能够正常工作。

嗨,kolossus,谢谢您的回答。您能推荐一种方法而不是另一种吗?我会选择第一种方法。在我的开发中,我通常会尝试避免绑定facele中的组件ts页面到后台bean,这主要是一个好的设计问题。绑定组件应该是最后的选择。