Primefaces ';组件不支持事件';从p:dataTable创建复合组件时出错

Primefaces ';组件不支持事件';从p:dataTable创建复合组件时出错,primefaces,jsf-2,datatable,Primefaces,Jsf 2,Datatable,从primefaces数据表创建复合组件时,我遇到以下错误。我做错了什么 Exception javax.faces.view.facelets.TagException: /view/restrito/basico/municipio.xhtml @77,165 <p:ajax> Composite component does not support event rowSelect 异常 javax.faces.view.facelets.TagException:

从primefaces数据表创建复合组件时,我遇到以下错误。我做错了什么

Exception 

    javax.faces.view.facelets.TagException: /view/restrito/basico/municipio.xhtml @77,165 <p:ajax> Composite component does not support event rowSelect
异常
javax.faces.view.facelets.TagException:/view/restrito/basico/municipio.xhtml@77165复合组件不支持事件行选择
tabela-padrao.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:cc="http://xmlns.jcp.org/jsf/composite"
  xmlns:c="http://java.sun.com/jsp/jstl/core"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://xmlns.jcp.org/jsf/core"
  xmlns:h="http://xmlns.jcp.org/jsf/html">

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="uniqueId" required="true" />
    <cc:attribute name="value" required="true" />
    <cc:attribute name="var" required="true" />
    <cc:attribute name="selection" required="true" />
    <cc:attribute name="exportedFileName" required="true" />
    <cc:attribute name="renderedTable" default="true"/>
    <cc:attribute name="primaryKey" required="true"/>

</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
    <p:dataTable value="#{cc.attrs.value}" 
                 id="#{cc.attrs.uniqueId}"
                 scrollable="true"
                 scrollWidth="100%"
                 var="#{cc.attrs.var}"
                 rendered="#{cc.attrs.renderedTable}"
                 selection="#{cc.attrs.selection}"
                 rowKey="#{cc.attrs.primaryKey}"                                             
                 selectionMode="single"
                 paginator="true"
                 rowsPerPageTemplate="15,30,45"
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown} {Exporters}"
                 emptyMessage="#{bundle.tabela_nenhum_registro_encontrado}">
        <cc:insertChildren/>
        <f:facet name="{Exporters}">
            <h:commandLink style="padding: 5px 5px 5px 5px ;" title="Converter para Excel" >                                            
                <h:outputText  styleClass="fa fa-file-excel-o Fs20"/>
                <p:dataExporter type="xls" target="#{cc.attrs.uniqueId}" fileName="#{cc.attrs.exportedFileName}" />
            </h:commandLink>
            <h:commandLink style="padding: 5px 5px 5px 5px ;" title="Converter para PDF" >
                <h:outputText  styleClass="fa fa-file-pdf-o Fs20"/>
                <p:dataExporter type="pdf" target="#{cc.attrs.uniqueId}" fileName="#{cc.attrs.exportedFileName}"/>
            </h:commandLink>
        </f:facet>
    </p:dataTable> 
</cc:implementation>

使用复合组件/Usando组件

<h:form id="tabela-municipio">
                    <ezcomp:tabela-padrao value="#{municipioMB.listaMunicipios}"
                                          uniqueId="id-tabela-municipio"
                                          var="mun" 
                                          primaryKey="#{mun.id}"
                                          selection="#{municipioMB.municipio}"
                                          exportedFileName="municipios">
                        <p:ajax event="rowSelect" listener="#{municipioMB.onRowSelect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" />
                        <p:ajax event="rowUnselect" listener="#{municipioMB.onRowUnselect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" />
                        <p:column headerText="Pais" width="300" filterBy="#{mun.estado.pais.nome}" filterMatchMode="contains">
                            <h:outputText value="#{mun.estado.pais.nome}"/>
                        </p:column>
                        <p:column headerText="Estado" width="300" filterBy="#{mun.estado.sigla} - #{mun.estado.nome}" filterMatchMode="contains">
                            <h:outputText value="#{mun.estado.sigla} - #{mun.estado.nome}"/>
                        </p:column>
                        <p:column headerText="Município" filterBy="#{mun.nome}" filterMatchMode="contains">
                            <h:outputText value="#{mun.nome}"/>
                        </p:column>
                    </ezcomp:tabela-padrao>
                </h:form>

您必须在复合组件中创建和注册自定义事件,并将相应的操作传递给datatable。因为rowSelect和rowUnselect事件是在datatable上注册的,而不是复合组件。使用clientBehavior为复合组件注册事件

<cc:interface>
    ...
    <cc:clientBehavior name="customRowSelectEvent" targets="idOfDataTable" event="rowSelect" />
    <cc:clientBehavior name="customRowUnselectEvent" targets="idOfDataTable" event="rowUnselect" />
</cc:interface>

...
  • name是自定义事件的名称
  • targets是要为其实际注册操作的组件的id。在您的示例中,是datatable的id
  • 事件是要为datatable注册的实际事件
  • 现在注册复合组件的事件

    <ezcomp:tabela-padrao ....>
        <f:ajax event="customRowSelectEvent" listener="#{municipioMB.onRowSelect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" />
        <f:ajax event="customRowUnselectEvent" listener="#{municipioMB.onRowUnselect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" />
          .....                  
    </ezcomp:tabela-padrao>
    
    
    .....                  
    
    我得到了这个例外/Ocorreu esta excção!广告:StandardWrapperValve[Faces Servlet]:Servlet Faces Servlet的Servlet.service()引发了异常java.lang.illegalargumentExceptions,因此这是您最初问题的答案(您的错误已经消失)。新的问题需要新的问题,但当然首先要从你的角度进行调查。请接受回答谢谢@Kukeltje,Wagnerh