Erro JSF: Cannot find component with identifier "enqueteDialog"

Olá, estou tentando chamar o dialog de dentro de um DataGrid, com os outros dados referentes ao meu objeto, porém o erro é este:

javax.servlet.ServletException: Cannot find component with identifier “enqueteDialog” referenced from “form:j_idt21:0:j_idt28”.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

Já tentei usar o padrão dos dois ponto update=":detalheEnquete" e o erro persiste, nem o Bean é chamado.

Segue meu código:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:comp="http://java.sun.com/jsf/composite/componentes"
	xmlns:p="http://primefaces.org/ui">
<h:head>
	<title>SCISPI - Sistema científico de enquetes e pesquisa</title>
</h:head>
<ui:composition template="_template.xhtml">
	<ui:define name="corpo">


		<p:dataGrid var="enquete" value="#{enqueteBean.enquetes}" columns="3"
			rows="12" paginator="false"
			paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">

			<div style="width: 400px; height: 100px" align="center">

				<p:panel header="#{enquete.nome}" style="text-align:center">

					<h:panelGrid columns="2" width="80%">
						<h:outputText value="Area:" style="font-weight:bold" />
						<h:outputText value="#{enquete.area}" />
						<h:outputText value="Descrição:" style="font-weight:bold" />
						<h:outputText value="#{enquete.descricao}" />
					</h:panelGrid>

					<p:commandLink update="detalheEnquete"
						oncomplete="enqueteDialog.show()" title="Detalhes da Enquete">
						<h:outputText styleClass="ui-icon ui-icon-search"
							style="margin:0 auto;" />
						<f:setPropertyActionListener value="#{enquete}"
							target="#{tableBean.enqueteSelecionada}" />
					</p:commandLink>
				</p:panel>
			</div>
		</p:dataGrid>

		<p:dialog header="Detalhes da Enquete" widgetVar="enqueteDialog"
			modal="true">
			<p:outputPanel id="detalheEnquete" style="text-align:center;"
				layout="block">

				<h:panelGrid columns="2" cellpadding="5">
					<h:outputLabel for="dataInicial" value="Inicio: " />
					<h:outputText id="dataInicial"
						value="#{enquete.enqueteSelecionada.dataInicial}" />

					<h:outputLabel for="dataFinal" value="Final: " />
					<h:outputText id="dataFinal"
						value="#{enquete.enqueteSelecionada.dataFinal}" />

					<h:outputLabel for="descricao" value="Descrição: " />
					<h:outputText id="descricao"
						value="#{enquete.enqueteSelecionada.descricao}" />
				</h:panelGrid>
			</p:outputPanel>
		</p:dialog>

	</ui:define>
</ui:composition>

</html>

Obrigado

cadê o form dentro desse dialog?

esse seu datagrid esta dentro de um form ?
pq nesse código nao está

Ele está dentro de um form, porém o form está no _template.xhtml.

Tentei colocar um form nesse xhtml mesmo, e ainda sim não achava o meu outputPanel.

Chamei meu form no index.xhtml de ‘index’ e deu o seguinte erro:

javax.servlet.ServletException: Cannot find component with identifier “:index:detalheEnquete” referenced from “form:index:j_idt21:0:j_idt29”.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

no p:dialog , você já experimentou usar
id="enqueteDialog"
ao invés de
widgetVar=“enqueteDialog”
? Essa troca às vezes dá certo.

Além disso, você vai ter que usar o “update” no seu commandLink para atualizar o dialog.

eu uso o dialog fora do form principal
e dentro do dialog eu coloco o form
e esse form vai conter o id no qual vc esta tentando chama
fazendo dessa maneira :seuId dessa maneira ele atualiza o
form que esta dentro do dialog

para fazer o update…

Mas me responda:

  1. independentemente do update, o dialog abriu?
  2. Qual a versão do primefaces?>

se eu tirar a tag update o dialog abre sim, mas com os valores nulos.

primefaces 3.3.1, senhor.

Experimente substituir…

&lt;p:commandLink update="detalheEnquete" oncomplete="enqueteDialog.show()" title="Detalhes da Enquete"&gt; &lt;h:outputText styleClass="ui-icon ui-icon-search" style="margin:0 auto;" /&gt; &lt;f:setPropertyActionListener value="#{enquete}" target="#{tableBean.enqueteSelecionada}" /&gt; &lt;/p:commandLink&gt;
por

&lt;p:commandButton update=":nomeDoForm:detalheEnquete" actionListener="#{enqueteBean.abrirEnquete(enquete.getId)}" immediate="true" value="abrir" /&gt;

e no enqueteBean, adicionar…

private Enquete enqueteAberta = new Enquete(); // + gets/sets public void abrirEnquete(int idEnquete){ enqueteAberta = new Enquete(); enqueteAberta = EnqueteDAO.class.newInstance().obterEnquetePorID( idEnquete ); }
É possível passar variáveis de tipos primitivos sem problemas com o actionListener. Mas lembre-se de que o dialog detalheEnquete deverá utilizar os dados do objeto enqueteBean.enqueteAberta
Por várias vezes, quando o f:setPropertyActionListener não funcionava comigo, eu substituía por uma solução parecida com esta.

Desvantagem de tudo: um consumo a mais de RAM.