Jsf primefaces uiViewRoot查找内部组件<;p:dataTable>;
我使用的是PrimeFaces3.2 我有以下情况:Jsf primefaces uiViewRoot查找内部组件<;p:dataTable>;,jsf,datatable,primefaces,components,Jsf,Datatable,Primefaces,Components,我使用的是PrimeFaces3.2 我有以下情况: <h:form id="someForm"> .. <p:dataTable id="someDataTable" value="#{BackingBean.list}" var="element" ..> <p:column> <p:calendar id="someCalendar" value=#{element.date} ../> <p:m
<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>
其中i是dataTable中“元素”的索引,它与BackingBean中列表中的索引相同
问题是我得到了NullPointerException,因为facesContext.getViewRoot().findComponent(..)方法找不到该组件,尽管我在视图中检查了日历的生成id,它是
:someForm:someDataTable:0:someCalendar用于第一个元素,它应该是:someForm:someDataTable:1:someCalendar用于下一个元素等
为什么facesContext.getViewRoot().findComponent(..)方法在中找不到该组件?是动态更新的,可能服务器端在提交完成后没有得到更新的组件树
提前谢谢 这是因为
p:dataTable
是一个重复的组件,在视图构建期间,视图根目录中只有一个日历。它具有idsomeForm:someDataTable:someCalendar
只有在视图渲染期间,才会创建表行并生成与行相关的ID
您应该使用JSF内置验证工具检查日期:
他认为:
<p:calendar id="someCalendar" value=#{element.date}
validator="#{BackinBean.validateDate}"/>
<p:message id="someCalendarMessage" for="someCalendar"/>
验证方法中的FacesMessage将自动显示在正确的表格行中。这是否意味着在这种情况下不可能进行跨字段验证?
<p:calendar id="someCalendar" value=#{element.date}
validator="#{BackinBean.validateDate}"/>
<p:message id="someCalendarMessage" for="someCalendar"/>
public void validateDate(
FacesContext context,
UIComponent component,
Object value) throws ValidatorException {
if (/* date is not valid */) {
throw new ValidatorException(
new FacesMessage("Date is not valid"));
}
}