P:confirmDialog não executa método do MB de forma alguma
9 respostas
I
igorthurler
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:compositiontemplate="/template/admintemplate.xhtml"><ui:definename="conteudo"><h:form><h:commandLinkaction="#{adesaoBean.novo}"><h:graphicImagelibrary="imagens"name="cadastraradesao.png"style="border:0;"/></h:commandLink></h:form><hr/><h:formid="frmlistaadesao"prependId="false"><p:messagesid="mensagens"showDetail="false"autoUpdate="true"closable="true"/><p:dataTableid="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:facetname="header"><h:outputTextvalue="Duração"/></f:facet><h:outputTextvalue="#{adesao.duracao}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Descrição"/></f:facet><h:outputTextvalue="#{adesao.descricao}"/></p:column><p:columnstyle="text-align: center;"><f:facetname="header"><h:outputTextvalue="Grátis"/></f:facet><h:graphicImagelibrary="imagens"name="check_#{adesao.gratis}.png"style="border:0; text-align: center;"/></p:column><p:columnstyle="text-align: center;"><f:facetname="header"><h:outputTextvalue="Ativo"/></f:facet><h:graphicImagelibrary="imagens"name="check_#{adesao.ativo}.png"style="border:0;"/></p:column><p:columnstyle="text-align: center;"><f:facetname="header"><h:outputTextvalue="Editar"/></f:facet><h:commandLinkaction="#{adesaoBean.editar}"><h:graphicImagelibrary="imagens"name="editar.png"style="border:0;"/><f:setPropertyActionListenertarget="#{adesaoBean.adesao}"value="#{adesao}"/></h:commandLink></p:column><p:columnstyle="text-align: center;"><f:facetname="header"><h:outputTextvalue="Desativar"/></f:facet><h:commandLinkaction="#{adesaoBean.desativar}"><h:graphicImagelibrary="imagens"name="desativar.png"style="border:0;"/><f:setPropertyActionListenertarget="#{adesaoBean.adesao}"value="#{adesao}"/></h:commandLink></p:column><p:columnstyle="text-align: center;"><f:facetname="header"><h:outputTextvalue="Excluir"/></f:facet><h:commandLinkonclick="confirmacao.show(); return false;"><h:graphicImagelibrary="imagens"name="excluir.png"style="border:0;"/><f:setPropertyActionListenertarget="#{adesaoBean.adesao}"value="#{adesao}"/></h:commandLink></p:column></p:dataTable><p:confirmDialogwidgetVar="confirmacao"header="Excluir Plano de Adesão"message="Deseja excluir o plano de adesão selecionado?"severity="alert"modal="true"appendToBody="true"><p:commandButtonvalue="Sim"oncomplete="confirmacao.hide()"action="#{adesaoBean.excluir}"update="mensagens"/><p:commandButtonvalue="Não"onclick="confirmacao.hide()"type="button"/></p:confirmDialog></h:form></ui:define></ui:composition></h:body>
Adicione a propriedade immediate com valor true e process com valor @this no commandButton de value sim do dialog.
[]`s
I
igorthurler
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.
I
igorthurler
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:
packageskymedic.adesao;importjava.util.ArrayList;importjava.util.List;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.RequestScoped;importsistemasas.adesao.Adesao;importsistemasas.adesao.AdesaoBusiness;importsistemasas.adesao.AdesaoValidaAtributos;importsistemasas.modulo.Modulo;importsistemasas.utils.mensagem.FormataMensagem;importskymedic.modulo.ModuloBean;importskymedic.utils.ExibeMensagem;//Define o nome da variável que será utilizada na página@ManagedBean(name="adesaoBean")// Define o escopo do ojeto@RequestScopedpublicclassAdesaoBean{privatefinalStringPAGINA_ADESAO_CADASTRO="adesaocadastro";privatefinalStringPAGINA_ADESAO_EDICAO="/admin/adesaocadastro";privatefinalStringPAGINA_ADESAO_LISTA="adesaolista";privateAdesaoadesao;privateList<Adesao>adesoes;privateInteger[]modulosSelecionados;privateList<Modulo>modulosDoSistema;publicAdesaoBean(){this.adesao=AdesaoFactory.criarAdesao();}publicAdesaogetAdesao(){returnadesao;}publicvoidsetAdesao(Adesaoadesao){this.adesao=adesao;}publicInteger[]getModulosSelecionados(){if((this.adesao.getModulos()!=null)&&(!this.adesao.getModulos().isEmpty())){this.modulosSelecionados=newInteger[this.adesao.getModulos().size()];for(inti=0;i<=(this.adesao.getModulos().size()-1);i++){this.modulosSelecionados[i]=this.adesao.getModulos().get(i).getId();}}returnmodulosSelecionados;}publicvoidsetModulosSelecionados(Integer[]modulosSelecionados){this.modulosSelecionados=modulosSelecionados;}publicList<Modulo>getModulosDoSistema(){if(modulosDoSistema==null){ModuloBeanmodulo=newModuloBean();this.modulosDoSistema=modulo.getListagem();}returnmodulosDoSistema;}publicStringnovo(){returnPAGINA_ADESAO_CADASTRO;}publicStringeditar(){returnPAGINA_ADESAO_EDICAO;}publicStringsalvar(){try{if(this.modulosSelecionados!=null){converterEAtribuirModulosSelecionados();}validarAtributos();AdesaoBusinessadesaoBusiness=AdesaoFactory.criarAdesaoBusiness();adesaoBusiness.salvar(this.adesao);ExibeMensagem.exibirMensagemOK("Plano de adesão gravado com sucesso");returnPAGINA_ADESAO_LISTA;}catch(Exceptione){ExibeMensagem.exibirMensagemErro(e.getMessage(),"");}returnnull;}privatevoidconverterEAtribuirModulosSelecionados(){List<Modulo>modulosConvertidos=newArrayList<Modulo>();for(inti=0;(i<=(modulosSelecionados.length-1));i++){intidModulo=this.modulosSelecionados[i];for(Modulomodulos:this.modulosDoSistema){if(modulos.getId()==idModulo){modulosConvertidos.add(modulos);}}}this.adesao.setModulos(modulosConvertidos);}publicStringexcluir(){try{AdesaoBusinessadesaoBusiness=AdesaoFactory.criarAdesaoBusiness();adesaoBusiness.excluir(this.adesao);this.adesao=AdesaoFactory.criarAdesao();this.adesoes=null;ExibeMensagem.exibirMensagemOK("Plano de adesão excluído com sucesso");returnPAGINA_ADESAO_LISTA;}catch(Exceptione){e.printStackTrace();ExibeMensagem.exibirMensagemErro(e.getMessage(),"");}returnnull;}publicStringdesativar(){try{AdesaoBusinessadesaoBusiness=AdesaoFactory.criarAdesaoBusiness();adesaoBusiness.desativar(this.adesao);ExibeMensagem.exibirMensagemOK("Plano de adesão desativado com sucesso");returnPAGINA_ADESAO_LISTA;}catch(Exceptione){ExibeMensagem.exibirMensagemErro(e.getMessage(),"");}returnnull;}publicList<Adesao>getListagem(){if(adesoes==null){AdesaoBusinessadesaoBusiness=AdesaoFactory.criarAdesaoBusiness();adesoes=adesaoBusiness.listar();}returnadesoes;}privatevoidvalidarAtributos()throwsException{AdesaoValidaAtributosvalidador=AdesaoFactory.criarAdesaoValidaAtributos();List<String>erros=validador.validarAtributos(this.adesao);if(!erros.isEmpty()){FormataMensagemmsg=newFormataMensagem();msg.addMensagens(erros);thrownewException(msg.getMensagens());}}}
I
igorthurler
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:confirmDialogwidgetVar="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:commandButtonvalue="Sim"oncomplete="confirmacao.hide()"action="#{adesaoBean.excluir(adesao)}"update="mensagens"immediate="true"process="@this"/><p:commandButtonvalue="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?
I
igorthurler
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:confirmDialogwidgetVar="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:commandButtonvalue="Sim"oncomplete="confirmacao.hide()"action="#{adesaoBean.excluir(adesao)}"update=":frmlistaadesao:dttlistaadesao"immediate="true"process="@this"/><p:commandButtonvalue="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"><htmlxmlns="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><metahttp-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:compositiontemplate="/template/admintemplate.xhtml"><ui:definename="conteudo"><h:form><h:commandLinkaction="#{adesaoBean.novo}"><h:graphicImagelibrary="imagens"name="cadastraradesao.png"style="border:0;"/></h:commandLink></h:form><hr/><h:formid="frmlistaadesao"prependId="false"><p:messagesid="mensagens"showDetail="false"autoUpdate="true"closable="true"/><p:dataTableid="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:columnheaderText="Duração"><h:outputTextvalue="#{adesao.duracao}"/></p:column><p:columnheaderText="Descrição"><h:outputTextvalue="#{adesao.descricao}"/></p:column><p:columnheaderText="Grátis"style="text-align: center;"><h:graphicImagelibrary="imagens"name="check_#{adesao.gratis}.png"style="border:0; text-align: center;"/></p:column><p:columnheaderText="Ativo"style="text-align: center;"><h:graphicImagelibrary="imagens"name="check_#{adesao.ativo}.png"style="border:0;"/></p:column><p:columnheaderText="Editar"style="text-align: center;"><h:commandLinkaction="#{adesaoBean.editar}"><h:graphicImagelibrary="imagens"name="editar.png"style="border:0;"/><f:setPropertyActionListenertarget="#{adesaoBean.adesao}"value="#{adesao}"/></h:commandLink></p:column><p:columnheaderText="Desativar"style="text-align: center;"><h:commandLinkaction="#{adesaoBean.desativar}"><h:graphicImagelibrary="imagens"name="desativar.png"style="border:0;"/><f:setPropertyActionListenertarget="#{adesaoBean.adesao}"value="#{adesao}"/></h:commandLink></p:column><p:columnheaderText="Excluir"style="text-align: center;"><h:commandLinkonclick="confirmacao.show(); return false;"><h:graphicImagelibrary="imagens"name="excluir.png"style="border:0;"/><f:setPropertyActionListenertarget="#{adesaoBean.adesao}"value="#{adesao}"/></h:commandLink></p:column></p:dataTable><p:confirmDialogwidgetVar="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:commandButtonvalue="Sim"oncomplete="confirmacao.hide()"action="#{adesaoBean.excluir(adesao)}"update=":frmlistaadesao:dttlistaadesao"immediate="true"process="@this"/><p:commandButtonvalue="Não"onclick="confirmacao.hide()"type="button"/></p:confirmDialog></h:form></ui:define></ui:composition></h:body></html>
ricardoleme
Igor,
Obrigado por compartilhar! (Eu já havia desistido de colocar o botão no meu programa)
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
I
igorthurler
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.
ricardoleme
Olá!
Apenas para documentar:
O meu ManagedBean está com a seguinte anottation: @SessionScoped
E mesmo assim o danado só apaga o primeiro!
tjunior
Olá Pessoal!
Consegui resolver (também tive problemas), segue o link: