Spring 由于未初始化托管Bean属性,JSF 2 ProcessValidationPhase失败
我正在寻找关于如何实施以下内容的最佳实践指导。我正在使用JSF2、Spring3、PrimeFaces3.3和MyBatis 要求: 我有一个数据输入屏幕,输入字段链接到VO对象,它是托管bean上的一个属性。用户可以创建新记录,也可以搜索要编辑的现有记录 选择“编辑现有记录”选项后,将出现一个对话框,用户可以在其中搜索和检索要从中选择的潜在记录列表 他们一次只能选择一条记录进行编辑。完成选择后,对话框将关闭,VO对象将填充所选数据,供用户编辑 问题: 当提交搜索表单以检索要编辑的潜在记录列表时,VO对象尚未初始化,并导致ProcessValidationPhase以“无法访问目标”使流程失败 实现此场景的最佳方式是什么?VO对象是否应该在托管bean中用空值初始化?或者应该在托管bean初始化期间调用的VO对象上有一个初始化方法吗 DataEntry.XHTML 主要数据输入字段:Spring 由于未初始化托管Bean属性,JSF 2 ProcessValidationPhase失败,spring,jsf-2,Spring,Jsf 2,我正在寻找关于如何实施以下内容的最佳实践指导。我正在使用JSF2、Spring3、PrimeFaces3.3和MyBatis 要求: 我有一个数据输入屏幕,输入字段链接到VO对象,它是托管bean上的一个属性。用户可以创建新记录,也可以搜索要编辑的现有记录 选择“编辑现有记录”选项后,将出现一个对话框,用户可以在其中搜索和检索要从中选择的潜在记录列表 他们一次只能选择一条记录进行编辑。完成选择后,对话框将关闭,VO对象将填充所选数据,供用户编辑 问题: 当提交搜索表单以检索要编辑的潜在记录列表时
<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,这主要是一个好的设计问题。绑定组件应该是最后的选择。