P:confirmDialog não executa método do MB de forma alguma

Primeiro quero me desculpar por parecer redundante com esse assunto, mas eu juro que tentei todas as soluções colocadas aqui no forum.
Estou abrindo esse tópico após tentar todas as formas que eu encontrei.
O meu problema é o mesmo de sempre: Ao clicar no link para excluir um registro, exibo uma tela de confirmação, mas quando eu clico no botão “Sim” o evento do ManagedBean associado simplesmente não executa. Sem a chamada do p:confirmDialog funciona.

Segue abaixo o código que eu estou utilizando…alguém por favor pode olhar e me ajudar a identificar o problema?

<h:body>	
	<ui:composition template="/template/admintemplate.xhtml">
		<ui:define name="conteudo">			
			<h:form>
	        	<h:commandLink action="#{adesaoBean.novo}">
	        		<h:graphicImage library="imagens" name="cadastraradesao.png" style="border:0;"/>
	        	</h:commandLink>					
			</h:form>
			<hr/>
			<h:form id="frmlistaadesao" prependId="false">
			
				<p:messages id="mensagens" showDetail="false" autoUpdate="true" closable="true"/>
												
    			<p:dataTable id="dttlistaadesao" var="adesao" value="#{adesaoBean.listagem}"  
                	paginator="true" rows="15"  
                 	paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 	rowsPerPageTemplate="15,35,50"
                 	emptyMessage="Nenhum Plano de Adesão Cadastrado">
                 		  
			        <p:column>  
			            <f:facet name="header">  
			                <h:outputText value="Duração" />  
			            </f:facet>  
			            <h:outputText value="#{adesao.duracao}" />  
			        </p:column>
			        
			        <p:column>  
			            <f:facet name="header">  
			                <h:outputText value="Descrição" />  
			            </f:facet>  
			            <h:outputText value="#{adesao.descricao}" />  
			        </p:column>
			        
			        <p:column style="text-align: center;">  
			            <f:facet name="header">  
			                <h:outputText value="Grátis" />  
			            </f:facet>  
			            <h:graphicImage library="imagens" name="check_#{adesao.gratis}.png" style="border:0; text-align: center;"/>
			        </p:column>
			        
			        <p:column style="text-align: center;">  
			            <f:facet name="header">  
			                <h:outputText value="Ativo" />  
			            </f:facet>  
			            <h:graphicImage library="imagens" name="check_#{adesao.ativo}.png" style="border:0;"/>  
			        </p:column>  
			        
			        <p:column style="text-align: center;">
			            <f:facet name="header">  
			                <h:outputText value="Editar" />  
			            </f:facet>  			        
			        	<h:commandLink action="#{adesaoBean.editar}">
			        		<h:graphicImage library="imagens" name="editar.png" style="border:0;"/>
			        		<f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/>
			        	</h:commandLink>
			        </p:column>
			        
			        <p:column style="text-align: center;">
			            <f:facet name="header">  
			                <h:outputText value="Desativar" />  
			            </f:facet>  			       
			        	<h:commandLink action="#{adesaoBean.desativar}">
			        		<h:graphicImage library="imagens" name="desativar.png" style="border:0;"/>
			        		<f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/>
			        	</h:commandLink>
				    </p:column>				        	
			        
			        <p:column style="text-align: center;">	
			            <f:facet name="header">  
			                <h:outputText value="Excluir" />  
			            </f:facet>  			      	        	
			        	<h:commandLink onclick="confirmacao.show(); return false;">
			        		<h:graphicImage library="imagens" name="excluir.png" style="border:0;"/>
			        		<f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/>
			        	</h:commandLink>		
			        </p:column>  		        				       
			        			                
                </p:dataTable>  			            								                 
                
	  			<p:confirmDialog widgetVar="confirmacao" header="Excluir Plano de Adesão" 
	  				message="Deseja excluir o plano de adesão selecionado?" 
	  				severity="alert" modal="true" appendToBody="true">
					<p:commandButton value="Sim" oncomplete="confirmacao.hide()" 
						action="#{adesaoBean.excluir}" update="mensagens"/> 
					<p:commandButton value="Não" onclick="confirmacao.hide()" type="button" />
				</p:confirmDialog>            			                        
                
			</h:form>			
		</ui:define>
	</ui:composition>
</h:body>

Olá!

Adicione a propriedade immediate com valor true e process com valor @this no commandButton de value sim do dialog.

[]`s

Bem, pelo menos agora aconteceu alguma coisa, mesmo que seja um erro…
Quando eu coloquei immediate=“true” nada mudou, agora quando eu coloquei process="@this" recebi a seguinte mensagem de erro: Object references an unsaved transient instance - save the transient instance before flushing: sistemasas.adesao.Adesao.
Acredito que seja uma coisa com o hibernate. Vou investigar.

Debuguei o projeto e vi uma consa interessante.
Quando eu não utilizo a janela de confirmação, o meu objeto chega com os atributos preenchidos no método excluir do meu Bean, mas quando eu crio a janela de confirmação, o meu objeto chega sem o preenchimento dos atributos.
Mudei o escopo do meu ManagedBean para @SessionScope mas o problema permanece.

Vou colocar aqui a minha classe AdesaoBean:

package skymedic.adesao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import sistemasas.adesao.Adesao;
import sistemasas.adesao.AdesaoBusiness;
import sistemasas.adesao.AdesaoValidaAtributos;
import sistemasas.modulo.Modulo;
import sistemasas.utils.mensagem.FormataMensagem;
import skymedic.modulo.ModuloBean;
import skymedic.utils.ExibeMensagem;

//Define o nome da variável que será utilizada na página
@ManagedBean(name="adesaoBean")
// Define o escopo do ojeto
@RequestScoped
public class AdesaoBean {

    private final String PAGINA_ADESAO_CADASTRO = "adesaocadastro";
    private final String PAGINA_ADESAO_EDICAO = "/admin/adesaocadastro";
    private final String PAGINA_ADESAO_LISTA = "adesaolista";
    
    private Adesao adesao;
    private List<Adesao> adesoes; 
    private Integer[] modulosSelecionados;
    private List<Modulo> modulosDoSistema;
        
    public AdesaoBean(){	
	
	this.adesao = AdesaoFactory.criarAdesao();
	
    }
        
    public Adesao getAdesao() {
        return adesao;
    }

    public void setAdesao(Adesao adesao) {
        this.adesao = adesao;
    }
    
    public Integer[] getModulosSelecionados() {
	
	if ((this.adesao.getModulos() != null) && (! this.adesao.getModulos().isEmpty())) {
	    this.modulosSelecionados = new Integer[this.adesao.getModulos().size()];
	    for(int i = 0; i <= (this.adesao.getModulos().size() - 1); i++) {
		this.modulosSelecionados[i] = this.adesao.getModulos().get(i).getId(); 
	    }
	}
	
        return modulosSelecionados;
    }

    public void setModulosSelecionados(Integer[] modulosSelecionados) {	
        this.modulosSelecionados = modulosSelecionados;
    }

    public List<Modulo> getModulosDoSistema() {
	
	if (modulosDoSistema == null) {
	    ModuloBean modulo = new ModuloBean();
            this.modulosDoSistema = modulo.getListagem();
	}
	
	return modulosDoSistema;
	
    }    
    
    public String novo() {
	
	return PAGINA_ADESAO_CADASTRO;
	
    }
    
    public String editar() {
	
	return PAGINA_ADESAO_EDICAO;
	
    }
    
    public String salvar() {
	
	try {
	    
	    if (this.modulosSelecionados != null) {
		converterEAtribuirModulosSelecionados();
	    }
	    
	    validarAtributos();	    	    
			   
	    AdesaoBusiness adesaoBusiness = AdesaoFactory.criarAdesaoBusiness();
	    adesaoBusiness.salvar(this.adesao);

	    ExibeMensagem.exibirMensagemOK("Plano de adesão gravado com sucesso");
	    
	    return PAGINA_ADESAO_LISTA;
	    
	} catch(Exception e) {
	    
	    ExibeMensagem.exibirMensagemErro(e.getMessage(), "");
	    
	}
	
	return null;
			
    }
    
    private void converterEAtribuirModulosSelecionados() {
	
	List<Modulo> modulosConvertidos = new ArrayList<Modulo>();
	
	for (int i = 0; (i <= (modulosSelecionados.length - 1)) ; i++) {
	    
	    int idModulo = this.modulosSelecionados[i];
	    
	    for (Modulo modulos: this.modulosDoSistema) {
		if (modulos.getId() == idModulo) {
		    modulosConvertidos.add(modulos);
		}
	    }
	    
	}
	
	this.adesao.setModulos(modulosConvertidos);
	
    }
    
    public String excluir() {

	try {	    
	    
	    AdesaoBusiness adesaoBusiness = AdesaoFactory.criarAdesaoBusiness();
	    adesaoBusiness.excluir(this.adesao);
	    
	    this.adesao = AdesaoFactory.criarAdesao();	 
	    
	    this.adesoes = null;
	    
	    ExibeMensagem.exibirMensagemOK("Plano de adesão excluído com sucesso");	    
	    	    	    
	    return PAGINA_ADESAO_LISTA;
	    
	} catch(Exception e) {
	    e.printStackTrace();
	    ExibeMensagem.exibirMensagemErro(e.getMessage(), "");
	    
	}	
	
	return null;
    }
    
    public String desativar() {

	try {	    
	    
	    AdesaoBusiness adesaoBusiness = AdesaoFactory.criarAdesaoBusiness();
	    adesaoBusiness.desativar(this.adesao);
	    
	    ExibeMensagem.exibirMensagemOK("Plano de adesão desativado com sucesso");
	    
	    return PAGINA_ADESAO_LISTA;
	    
	} catch(Exception e) {
	    
	    ExibeMensagem.exibirMensagemErro(e.getMessage(), "");	    
	    
	}	
	
	return null;
	
    }
    
    public List<Adesao> getListagem() {	
	
	if (adesoes == null) {
	    AdesaoBusiness adesaoBusiness = AdesaoFactory.criarAdesaoBusiness();
	    adesoes = adesaoBusiness.listar();
	}
	
	return adesoes;
	
    }
    
    private void validarAtributos() throws Exception {

	AdesaoValidaAtributos validador = AdesaoFactory.criarAdesaoValidaAtributos();
	
	List<String> erros = validador.validarAtributos(this.adesao); 
			
	if (! erros.isEmpty()) {
	    
	    FormataMensagem msg = new FormataMensagem();
		
	    msg.addMensagens(erros);	    
	    
	    throw new Exception(msg.getMensagens());
	}
	
    }
        
}

Consegui resolver parte do problema.
Coloco aqui as minhas considerações, me corrijam se eu estiver enganado. Me parece que quando eu chamo o p:confirmDialog um novo Bean é criado, mesmo eu passando <f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/> o meu objeto adesao chega com atributos não preenchidos.
Eu alterei o método excluir do meu Bean para receber o objeto que será deletado como parâmetro e o meu confirmDialog ficou da seguinte maneira:

<p:confirmDialog widgetVar="confirmacao" header="Excluir Plano de Adesão" 
	message="Deseja excluir o plano de adesão selecionado?" 
	severity="alert" modal="true" appendToBody="true" closable="false">
	<p:commandButton value="Sim" oncomplete="confirmacao.hide()" 
		action="#{adesaoBean.excluir(adesao)}" update="mensagens" 
		immediate="true" process="@this"/> 
	<p:commandButton value="Não" onclick="confirmacao.hide()" type="button" />
</p:confirmDialog>     				    

A partir de então o meu registro está sendo apagado da tabela, mas quando o confirmDialog fecha, o formulário não é atualizado. Alguém sabe como posso forçar a atualização do formulário assim que o confirmDialog fechar?

FINALMENTE…
Galera consegui resolver meu problema da seguinte forma:
1- O método excluir do meu ManagedBean passou a ter um parâmetro para receber o objeto que eu vou excluir public String excluir(Adesao adesao)
2- O código do meu confirmDialog ficou assim:

<p:confirmDialog widgetVar="confirmacao" header="Excluir Plano de Adesão" 
	message="Deseja excluir o plano de adesão selecionado?" 
	severity="alert" modal="true" appendToBody="true" closable="false">
	<p:commandButton value="Sim" oncomplete="confirmacao.hide()" 
		action="#{adesaoBean.excluir(adesao)}" update=":frmlistaadesao:dttlistaadesao" 
		immediate="true" process="@this"/> 
	<p:commandButton value="Não" onclick="confirmacao.hide()" type="button" />
</p:confirmDialog>     		  

2.1- Reparem que o update define que a minha tabela será atualizada assim que o formDialog finalizar.

Vou colocar o código completo da minha página para avaliação de quem interessar:

[/code]

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui"
>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>SkyMedic - Sistema de controle de clínicas médicas e consultórios</title>
</h:head>
<h:body>	
	<ui:composition template="/template/admintemplate.xhtml">
		<ui:define name="conteudo">			
			<h:form>
	        	<h:commandLink action="#{adesaoBean.novo}">
	        		<h:graphicImage library="imagens" name="cadastraradesao.png" style="border:0;"/>
	        	</h:commandLink>					
			</h:form>
			<hr/>
			<h:form id="frmlistaadesao" prependId="false">
			
				<p:messages id="mensagens" showDetail="false" autoUpdate="true" closable="true"/>
												
    			<p:dataTable id="dttlistaadesao" var="adesao" value="#{adesaoBean.listagem}"  
                	paginator="true" rows="15"  
                 	paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 	rowsPerPageTemplate="15,35,50"
                 	emptyMessage="Nenhum Plano de Adesão Cadastrado">
                 		  
			        <p:column headerText="Duração">  
			            <h:outputText value="#{adesao.duracao}" />  
			        </p:column>
			        
			        <p:column headerText="Descrição">  
			            <h:outputText value="#{adesao.descricao}" />  
			        </p:column>
			        
			        <p:column headerText="Grátis" style="text-align: center;">  
			            <h:graphicImage library="imagens" name="check_#{adesao.gratis}.png" style="border:0; text-align: center;"/>
			        </p:column>
			        
			        <p:column headerText="Ativo" style="text-align: center;">  
			            <h:graphicImage library="imagens" name="check_#{adesao.ativo}.png" style="border:0;"/>  
			        </p:column>  
			        
			        <p:column headerText="Editar" style="text-align: center;">        
			        	<h:commandLink action="#{adesaoBean.editar}">
			        		<h:graphicImage library="imagens" name="editar.png" style="border:0;"/>
			        		<f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/>
			        	</h:commandLink>
			        </p:column>
			        
			        <p:column headerText="Desativar" style="text-align: center;">    
			        	<h:commandLink action="#{adesaoBean.desativar}">
			        		<h:graphicImage library="imagens" name="desativar.png" style="border:0;"/>
			        		<f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/>
			        	</h:commandLink>
				    </p:column>				        	

			        <p:column headerText="Excluir" style="text-align: center;">	     	        	
			        	<h:commandLink onclick="confirmacao.show(); return false;">
			        		<h:graphicImage library="imagens" name="excluir.png" style="border:0;"/>
			        		<f:setPropertyActionListener target="#{adesaoBean.adesao}" value="#{adesao}"/>
			        	</h:commandLink>
			        		        			
			        </p:column>  		        				       
       						               						               						        
                </p:dataTable>  	
                
	  			<p:confirmDialog widgetVar="confirmacao" header="Excluir Plano de Adesão" 
	  				message="Deseja excluir o plano de adesão selecionado?" 
	  				severity="alert" modal="true" appendToBody="true" closable="false">
					<p:commandButton value="Sim" oncomplete="confirmacao.hide()" 
						action="#{adesaoBean.excluir(adesao)}" update=":frmlistaadesao:dttlistaadesao" 
						immediate="true" process="@this"/> 
					<p:commandButton value="Não" onclick="confirmacao.hide()" type="button" />
				</p:confirmDialog>     		                		            								                 
                      
			</h:form>			
		</ui:define>
	</ui:composition>
</h:body>
</html>

Igor,

Obrigado por compartilhar! (Eu já havia desistido de colocar o botão no meu programa) :wink:
Eu implementei da mesma forma que você citou, porém eu notei que sempre está apagando o primeiro registro do datatable.
Você poderia verificar se isso está ocorrendo com você também?

O que será que pode ser hein? :roll:

[]´s

Realmente vc está correto…Peço 1000 desculpas a todos
Eu andei estudando ontem o dia todo e o que eu percebi é que se o meu ManagedBean é anotado com @RequestScoped não rola.
Eu to tentando com @ViewScoped. Vou reabrir o post e continuar pesquisando.

Olá!

Apenas para documentar: :wink:
O meu ManagedBean está com a seguinte anottation: @SessionScoped
E mesmo assim o danado só apaga o primeiro! :cry:

Olá Pessoal!

Consegui resolver (também tive problemas), segue o link:

valeu