Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Problema com Ajax -> Update de um commandButton não funciona

Olá,

Estou criando um sistema a partir dos conhecimento do curso, mas me deparei com um problema:

Na tela a seguir, tenho um commandbutton (utlima collumn da dataTable) cuja função é remover o item da sua respectiva linha quando clicado e atualizar a tabela, ou seja ao clicar nele toda a linha onde ele está deveria sumir. Porém a tabela não é atualizada. A operação de remoção da entidade acontece, tanto que ao recarregar a pagina, de fato, o elemento excluído não é mais listado.

<ui:composition template="/WEB-INF/templates/LayoutPadrao.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions">

    <ui:define name="titulo">SGC - Home</ui:define>
    <ui:define name="corpo">
        <h:form id="formHome">
        <p:growl autoUpdate="true" closable="true"/>

            <p:dataTable value="#{consultarCursosBean.cursos}" var="curso"
                style="width:90%;margin: 50px auto;"
                emptyMessage="Nenhum curso cadastrado" id="tabelaCursos">

                <f:facet name="header">
                  Cursos cadastrados no sistema
            </f:facet>
                <p:column headerText="Titulo">
                    <p:outputLabel value="#{curso.titulo}" />
                </p:column>
                <p:column headerText="Area do conhecimento">
                    <p:outputLabel value="#{curso.areaDoConhecimento}" />
                </p:column>
                <p:column headerText="Quantidade de inscritos">
                    <p:outputLabel value="#{fn:length(curso.alunos)}" />
                </p:column>
                <p:column headerText="Instrutor">
                    <p:outputLabel value="#{curso.instrutor.nome}" />
                </p:column>
                <p:column headerText="Sala">
                    <p:outputLabel value="#{curso.sala}" />
                </p:column>
                <p:column headerText="Data">
                    <p:outputLabel value="#{curso.data}">
                    </p:outputLabel>
                </p:column>
                <p:column>
                    <p:commandButton icon="ui-icon-trash" title="Excluir"
                        process="@this" partialSubmit="true"
                        update="tabelaCursos" 
                        action="#{cadastroCursoBean.excluir}">
                        <f:setPropertyActionListener target="#{cadastroCursoBean.curso}"
                            value="#{curso}" />
                    </p:commandButton>
                </p:column>
                <f:facet name="footer">
                #{fn:length(consultarCursosBean.cursos)} cadastrados no sistema.
            </f:facet>
            </p:dataTable>
        </h:form>
    </ui:define>
</ui:composition>

Me parece estranho que nesta mesma aplicação, tenho a seguinte tela (colei apenas o datatable de interesse, pois o código inteiro da pagina estava sendo truncado aqui. Este dataTable também está dentro de um <h:form> assim como o caso anterior):

<p:dataTable value="#{cadastroCursoBean.curso.alunos}" var="aluno"
                    emptyMessage="Nenhum aluno inscrito" id="tabelaAlunos">
                    <p:column headerText="nome" style="text-align:center">
                        <h:outputText value="#{aluno.nome}" />
                    </p:column>
                    <p:column headerText="profissao" style="text-align:center">
                        <h:outputText value="#{aluno.profissao}" />
                    </p:column>
                    <p:column headerText="email" style="text-align:center">
                        <h:outputText value="#{aluno.email}" />
                    </p:column>
                    <p:column headerText="cidade" style="text-align:center">
                        <h:outputText value="#{aluno.municipio}" />
                    </p:column>
                    <p:column headerText="Remover" style="text-align:center">
                        <p:commandButton icon="ui-icon-trash"
                            action="#{cadastroCursoBean.removeAluno}" process="@this"
                            update="tabelaAlunos" partialSubmit="true">
                            <f:setPropertyActionListener value="#{aluno}"
                                target="#{cadastroCursoBean.alunoSelecionado}"/>
                        </p:commandButton>
                    </p:column>
                </p:dataTable>

E esta funciona normalmente com o comportamento que desejo.

Alguém pode me ajudar a entender o que houve para que eu possa resolver isso ?

Obrigado!

4 respostas

Tá dando alguma mensagem de erro? Se sim posta aqui pra gente analisar.

Obrigado por sua resposta Victor,

Além do sql's gerados pelo hibernate não aprece nenhuma mensagem no console. No navegador o corpo da requisição disparada pelo botão é esse:

javax.faces.partial.ajax: true
javax.faces.source: formHome:tabelaCursos:0:j_idt47
javax.faces.partial.execute: formHome:tabelaCursos:0:j_idt47
javax.faces.partial.render: formHome:tabelaCursos
formHome:tabelaCursos:0:j_idt47: formHome:tabelaCursos:0:j_idt47
javax.faces.ViewState: 4276791170110692547:-3518935852661461450

Estou sem ideias, preciso estudar mais sobre esse assunto. Algum instrutor poderia nos ajudar a chegar nessa solução?

solução

Olá,

Acabei encontrando o problema e havia esquecido de voltar aqui e relatar. Acabou que era algo bem básico, um descuido de minha parte.

O problema estava no bean da página, a função que eu estava invocando no botão apenas estava removendo a entidade "Aluno" apenas do banco de dados, de forma que como o escopo é view, ainda permanecia na lista que populava a lista até que fosse atualizada a página.

Resolvido!