[RESOLVIDO] Jsf / Primefaces - Erro com dialog

Boa tarde comunidade, venho pedir ajuda a vocês…
Seguinte, estou desenvolvendo uma aplicação a na exclusão eu gostaria de pedir a confirmação do usuário. Se eu coloco direto na action do botão ele funciona perfeitamente, porém, se do botão eu chamo uma p:confirmDialog, ele perde o objeto e tenho assim um nullpointer!

Código do meu xhtml onde está o botão de exclusão e o dialog

			<f:facet name="footer">
				<h:commandButton id="btnAlterar" value="Alterar"
					action="#{arquivosController.popularArquivoParaAlteracao}"
					rendered="#{arquivosController.flagHabilitaBotao}" />

				<h:commandButton id="btnExcluir" value="Excluir"
					rendered="#{arquivosController.flagHabilitaBotao}"
					onclick="dialogArquivo.show()" />
				
			</f:facet>
		</p:dataTable>
	</h:form>
	
	<p:confirmDialog message="Deseja realmente excluir?"  
                             header="Excluir Arquivo"  
                             severity="alert"  
                             closable="false"  
                             modal="true"  
                             widgetVar="dialogArquivo">  
                <p:outputPanel>  
                    <h:form>  
                        <p:commandButton action="#{arquivosController.excluirArquivo}"  
                                         value="Sim"  
                                         process="@this"  
                                         oncomplete="dialogArquivo.hide()">  
                        </p:commandButton>  
                        <p:commandButton value="Não" oncomplete="dialogArquivo.hide()"/>  
                    </h:form>  
                </p:outputPanel>  
    </p:confirmDialog>

Código do meu bean
Lembrando que ele está com as anotações (@ManagedBean, @SessionScoped, @RequestScoped)

	public void excluirArquivo() {
		arquivosBO.excluirArquivo(arquivoSelecionado);
		pesquisarArquivos();
		limparCampos();
	}

Minha variável arquivoSelecionado está vindo nula… Sem o dialog ela funciona perfeitamente!

O confirmDialog deve estar dentro de um form. Caso crie outro form para ele, o botão que chama-lo tem que ter update=":outroForm"

Tirei ele do form e coloquei em outro form, mudei o botao de H:COMANDBUTTON para P:COMANDBUTTON ai coloquei o update=":outroform:iddialog" e mesmo assim nao funcionou!
Alguma outra sugestao?

Tente com um propertyActionListener dentro do seu p:commandButton:

<p:commandButton
	actionListener="#{arquivosController.excluirArquivo}"
            icon="ui-icon-trash" update=":outroForm"  onclick="dialogArquivo.show()">
	 <f:setPropertyActionListener target="#{arquivosController.arquivoSelecionado}" value="#{arquivo}" />
</p:commandButton>




public void excluirArquivo(ActionEvent actionEvent) {  
    arquivosBO.excluirArquivo(arquivoSelecionado);  
    pesquisarArquivos();  
    limparCampos();  
}         

Ps: Se estiver usando primefaces 4.0, o confirmDiaglo mudou, agora é só colocar essa linha dentro de um commandButton. Tem que colocar o setPropertyActionListener também, ficaria algo tipo:


<p:commandButton  
    actionListener="#{arquivosController.excluirArquivo}"  
            icon="ui-icon-trash" >  
     <f:setPropertyActionListener target="#{arquivosController.arquivoSelecionado}" value="#{arquivo}" />  
<p:confirm header="#Excluir" message="Confirmar Exclusão" icon="ui-icon-alert" />
</p:commandButton>  

[code] <p:commandButton id=“btnExcluir” value=“Excluir"
rendered=”#{arquivosController.flagHabilitaBotao}“
onclick=“dialogArquivo.show(); return false;” update=”:dialog:confirmaExclusao">

				<f:setPropertyActionListener target="#{arquivosController.arquivoSelecionado}" value="#{listArq}" />
			</p:commandButton>

[/code]

	<h:form id="dialog">
	<p:confirmDialog message="Deseja realmente excluir?"  
                             header="Excluir Arquivo"  
                             severity="alert"  
                             closable="false"  
                             modal="true"  
                             widgetVar="dialogArquivo" id="confirmaExclusao">  
                <p:outputPanel>  
                    <h:form>  
                        <p:commandButton action="#{arquivosController.excluirArquivo}"  
                                         value="Sim"  
                                         process="@this"  
                                         oncomplete="dialogArquivo.hide()">  
                        </p:commandButton>  
                        <p:commandButton value="Não" oncomplete="dialogArquivo.hide()"/>  
                    </h:form>  
                </p:outputPanel>  
    </p:confirmDialog>
	</h:form>

Meu codigo ficou assim, porem, ao abrir o confirmDialog, quando eu clico no botao de “Sim” ele nem vai ao meu metodo de exclusao e da um nullpointer antes disso;

java.lang.NullPointerException at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:485) at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:73) at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:619) at javax.faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:116) at org.primefaces.context.PrimePartialResponseWriter.startDocument(PrimePartialResponseWriter.java:205) at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:201) at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:126) at javax.faces.context.ExceptionHandlerWrapper.handle(ExceptionHandlerWrapper.java:100) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Alguem tem noção do que possa ser?

Ali em cima você disse que o managedbean está com as anotações @Sessionscoped e @Requestscoped

Tem que ter só uma… tente deixar somente @Sessionscoped

Roselito, já tentei tirar o @RequestScope, porém mesmo assim não funcionou!!

Você está com forms aninhados. Isso não funciona de jeito nenhum. Eu tive problemas com o confirmDialog semana passada. Resolvi assim:

        <p:confirmDialog  widgetVar="cdPatrimonios" showEffect="fade" header="Atenção:" message="Confirma geração de patrimônios?" hideEffect="explode">
            <p:commandButton value="Sim" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" oncomplete="cdPatrimonio.hide()" actionListener="#{fileUploadController.patrimonios()}" />
            <p:commandButton value="Não" styleClass="ui-confirmdialog-no" icon="ui-icon-close" onclick="cdPatrimonio.hide()"/> 	
        </p:confirmDialog>

O método patrimonios() tem essa assinatura:

No meu caso, o confirmDialog está dentro do mesmo form de um dataTable.

Gostaria de agradecer a todos que me ajudaram, consegui resolver o meu problema… Talvez nem seja do jeito mais “certo”, mas funcionou e é o que importa rsrs…
Abaixo o código como ficou!

      <p:commandButton id="btnExcluir" value="Excluir"  
          rendered="#{arquivosController.flagHabilitaBotao}"  
          action="#{arquivosController.setaObjetoParaExcluir}"  oncomplete="dialogArquivo.show(); return false;">  
      </p:commandButton>  
   </facet>
</p:dataTable>

<p:confirmDialog message="Deseja realmente excluir?"    
                            header="Excluir Arquivo"    
                            severity="alert"    
                            closable="false"    
                            modal="true"    
                            widgetVar="dialogArquivo">    
               <p:outputPanel>    
                       <p:commandButton action="#{arquivosController.excluirArquivo}"    
                                        value="Sim"    
                                        process="@this"    
                                        oncomplete="dialogArquivo.hide()"
                                        update="formArquivos:datatableArquivo">    
                       </p:commandButton>    
                       <p:commandButton value="Não" oncomplete="dialogArquivo.hide()"/>    
               </p:outputPanel>    
   </p:confirmDialog>

Bean:

public void excluirArquivo(ActionEvent actionEvent) {    
    arquivosBO.excluirArquivo(excluirArquivoSelecionado );    
    pesquisarArquivos();    
    limparCampos();    
}  

public void setaObjetoParaExcluir() {
   excluirArquivoSelecionado = arquivoSelecionado;
}

E também retirei o @RequestScoped!
Mais uma vez, obrigado a todos que me ajudaram!

Que bom que conseguiu.

Só para informação. Quando não se seta o escopo de um managedbean, por default fica @RequestScoped.
Para melhor legibilidade do código, mesmo que não necessário, é recomendável a inserção do @RequestScoped.