我正在使用primefaces 3.2。
我有以下情况:
<h:form id="someForm">
..
<p:dataTable id="someDataTable" value="#{BackingBean.list}" var="element" ..>
<p:column>
<p:calendar id="someCalendar" value=#{element.date} ../>
<p:message id="someCalendarMessage" for=":someForm:someDataTable:someCalendar"/>
<p:column>
</p:dataTable>
..
</h:form>
“someDataTable”动态更新,然后将所有数据提交到服务器端。如果输入的日期不满足某些条件,我想在支持 bean 中发送日历“someCalendar”的消息。我尝试使用以下代码查找组件:
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage(facesContext.getViewRoot().findComponent(":someForm:someDataTable:" + "i" + ":someCalendar").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, Utils.getResourceBundleString("dictionary", "error") + ":", Utils.getResourceBundleString("dictionary", "some_message")));
return;
其中 i 是数据表中“元素”的索引,与位于 BackingBean 中的列表中的索引相同。
问题是我得到 NullPointerException 因为 facesContext.getViewRoot().findComponent(..) 方法找不到组件,尽管我在视图中检查了生成的日历 ID,它是 :someForm:someDataTable:0:someCalendar第一个元素,它应该是 :someForm:someDataTable:1:someCalendar 用于下一个元素等。
为什么 facesContext.getViewRoot().findComponent(..) 方法找不到里面的组件?是动态更新的,也许服务器端在提交完成后没有得到更新的组件树?
提前致谢。