Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf primefaces uiViewRoot查找内部组件<;p:dataTable>;_Jsf_Datatable_Primefaces_Components - Fatal编程技术网

Jsf primefaces uiViewRoot查找内部组件<;p:dataTable>;

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

我使用的是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: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
是一个重复的组件,在视图构建期间,视图根目录中只有一个日历。它具有id
someForm: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"));
        }

}