DataTable não atualiza (Primefaces)

Galerinha… Estou tentando atualizar um dataTable com o ajax do primefaces, mas não está funcionando. Pesquisei aqui no fórum outras formas, mas as que encontrei não resolveram o problema…

1ª Passo.

Tenho um autoComplete, onde ao selecionar um usuário, verifico se já tem algum registro para o mesmo, e atualizo o dataTable com os registros desse usuário. Aqui o dataTable é atualizado sem problema…

<p:autoComplete id="pacienteD" value="#{dietaBean.paciente}" completeMethod="#{agendarConsulta.listaPacientes}" forceSelection="true">
          <p:ajax listener="#{dietaBean.onSelectUser}" event="itemSelect" update="hisDietaReg, tKcaldieta, tKcaldieta1" />
</p:autoComplete>
 <p:dataTable id="hisDietaReg" var="dietaReg"
                                         lazy="true" value="#{dietaBean.lista}"
                                         emptyMessage="Nenhum Registro Encontrado" paginator="true"
                                         paginatorAlwaysVisible="false" rows="5">
                                <f:facet name="header">
                                    <h:outputText value="Histórico de Dietas Registradas"/>
                                </f:facet>
                                <p:column style="width: 4%">
                                    <p:rowToggler/>
                                </p:column>
                                <p:column>
                                    <f:facet name="header">
                                        <h:outputText value="Peso (kg)" />
                                    </f:facet>
                                    <h:outputText value="#{dietaReg.peso}"/> 
                                </p:column>

//Outros campos do dataTable
 </p:dataTable>

2º Passo.

Ao salvar novos dados para o usuário selecionado, eu chamo novamente um update no dataTable, e ele não atualiza. Se eu atualizar a página com F5, ai o dataTable atualiza normalmente.

<p:commandButton id="btnRegDieta" value="Registrar Dieta" 
                                                 actionListener="#{dietaBean.save}" ajax="false" 
                                                 update="hisDietaReg, grolRegDieta"> //Aqui, solicito atualização do dataTable
</p:commandButton>

Tentei algumas soluções que encontrei aqui no fórum, mas até o momento, não consegui resolver…

Tentativas que já, com pesquisa no fórum…

<p:commandButton id="btnRegDieta" value="Registrar Dieta" 
                                                 actionListener="#{dietaBean.save}" ajax="false" 
                                                 update="hisDietaReg, grolRegDieta"> 

                                    <p:ajax update="hisDietaReg" event="click"/> //Colocar outro <p:ajax /> para atualizar o dataTable. 
//obs: Fiz essa tentativa com e sem um listener para a mesma função que chamo ao selecionar um usuário.
</p:commandButton>

Tentei forçar um refresh da página página com o seguinte código, postado por um colega do fórum.

   public void refresh() {
		FacesContext context = FacesContext.getCurrentInstance();
		Application application = context.getApplication();
		ViewHandler viewHandler = application.getViewHandler();
		UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
		context.setViewRoot(viewRoot);
		context.renderResponse();
	}

No método que salva os dados, chamo esse refresh(), mas também não funcionou…

Alguém tem alguma outra dica, para essa “segunda” atualização funcionar?

tenta colocar um p:outputpanel em volta do datatable, e atualiza o panel…

[quote=alanrodrigues]tenta colocar um p:outputpanel em volta do datatable, e atualiza o panel…
[/quote]

Infelizmente, não funcinou…

hm…
então…

coloca algo assim e testa

<h:panelGroup layout="block" id="tabelaPessoas">
				<p:outputPanel>
					<p:dataTable>

e atualiza o panelgroup

Deve estar acontecendo alguma exception em alguma fase do jsf, pois se ocorrer alguma exception não atualiza mesmo cria um phaseListener e ver se esta rolando alguma exception em algum ponto do seu código. Ou você pode atualizar do servidor e claro se ocorreu tudo da maneira que você esperava, abaixo segue o código:

RequestContext contextRequest = RequestContext.getCurrentInstance();
contextRequest.update("hisDietaReg");

Verificando…

[quote=alanrodrigues]hm…
então…

coloca algo assim e testa

<h:panelGroup layout="block" id="tabelaPessoas">
				<p:outputPanel>
					<p:dataTable>

e atualiza o panelgroup[/quote]

Não funciona… :cry:

[quote=srmachado]Deve estar acontecendo alguma exception em alguma fase do jsf, pois se ocorrer alguma exception não atualiza mesmo cria um phaseListener e ver se esta rolando alguma exception em algum ponto do seu código. Ou você pode atualizar do servidor e claro se ocorreu tudo da maneira que você esperava, abaixo segue o código:

RequestContext contextRequest = RequestContext.getCurrentInstance();
contextRequest.update("hisDietaReg");

[/quote]

Eu coloquei esse trecho de código logo após salvar as informações… no actionListener do botão que salva… Mas também nada… ele não atualiza o dataTable.

Eu tenho um PhaseListener na aplicação, onde verifico permissões de acesso, acesso via url e tals… Como faço para verificar se está rolando alguma exception com ele?

Pode ser a biblioteca do primefaces tbm, testa apagar a biblioteca do primefaces e no lugar dela coloca o arquivo .jar do primefaces.

Para verificar você tem que duperar sua aplicação, coloca os break points para cada chamada durante o ciclo de vida do jsf.

Sem erros no ciclo de vida do jsf…

Vou postar o código todo… vai ficar um pouco grande, mas de repente o erro é devido a estrutura que estou usando…

.XHTML

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:stella="http://stella.caelum.com.br/faces2"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:composition template="/templateFinal.xhtml">



        <ui:define name="main">  

            <h:form prependId="false" acceptcharset="ISO-8859-1" lang="pt_BR">
                <p:breadCrumb>
                    <p:menuitem value="#" />
                    <p:menuitem value="Administração" url="/dashboard.jsf"/>
                    <p:menuitem value="Cálculo Dietas" url="#"/>
                </p:breadCrumb>
                <br/>
                <p:growl id="grolRegDieta"/>
                <p:tabView id="tabViewcalcDieta">
                    <p:ajax event="tabChange" update="hisDietaMon, tKcaldieta, tKcaldieta1"/>
                    <p:tab id="tab1" title="Cálculo da Dieta">
                        <p:fieldset>
                            <h:panelGrid columns="2" style="width: 100%">

                                <h:panelGrid columns="2">
                                    <h:outputLabel for="pacienteD" value="Selecione o Paciente Desejado: " />
                                    <p:autoComplete id="pacienteD" value="#{dietaBean.paciente}" completeMethod="#{agendarConsulta.listaPacientes}" forceSelection="true">
                                        <p:ajax listener="#{dietaBean.onSelectUser}" event="itemSelect" update="hisDietaReg, tKcaldieta, tKcaldieta1" /> //Aqui o dataTable é atualizado sem problema
                                    </p:autoComplete>
                                    <h:outputLabel for="pesoD" value="Peso (kg): " />
                                    <p:inputMask id="pesoD" value="#{dietaBean.dieta.peso}" mask="999.99">
                                        <p:ajax listener="#{dietaBean.onChangePeso}" update="fatorTmb" event="change"/>
                                    </p:inputMask>
                                    <h:outputLabel for="atividadeD" value="Atividade Física: " />
                                    <p:selectOneMenu id="atividadeD" value="#{dietaBean.dieta.atividadeFisica}">
                                        <f:selectItem itemValue="nenhum" itemLabel=""/>
                                        <f:selectItem itemValue="leve" itemLabel="Leve"/>
                                        <f:selectItem itemValue="moderado" itemLabel="Moderado"/>
                                        <f:selectItem itemValue="intenso" itemLabel="Intenso"/>
                                        <p:ajax listener="#{dietaBean.onChangeAT}" event="change" update="fatorAtD"/>
                                    </p:selectOneMenu>
                                    <h:outputLabel for="fatorAtD" value="FA (Fator de Atividade): " />
                                    <p:inputMask id="fatorAtD" value="#{dietaBean.dieta.fatorAtividade}" disabled="true" mask="9.99"/>
                                    <h:outputLabel for="objD" value="Objetivo: "/>
                                    <p:selectOneRadio id="objD" value="#{dietaBean.dieta.objetivoDieta}">
                                        <f:selectItem itemValue="perder" itemLabel="Perder Peso"/>
                                        <f:selectItem itemValue="ganhar" itemLabel="Ganhar Peso"/>
                                        <p:ajax listener="#{dietaBean.onChangeObjetivo}" update="addKcal, lessKcal" event="change"/>
                                    </p:selectOneRadio>
                                    <h:outputLabel for="addKcal" value="Adicionar Calorias (Kcal): "/>
                                    <p:inputText id="addKcal" value="#{dietaBean.dieta.adicionarCalorias}" disabled="#{dietaBean.habAddCal}">
                                        <p:ajax listener="#{dietaBean.onAddKcal}" update="vet, vetTab2" event="blur"/>
                                    </p:inputText>
                                    <h:outputLabel for="lessKcal" value="Descontar Calorias (Kcal): "/>
                                    <p:inputText id="lessKcal" value="#{dietaBean.dieta.descontarCalorias}" disabled="#{dietaBean.habLessCal}">
                                        <p:ajax listener="#{dietaBean.onLessKcal}" update="vet, vetTab2" event="blur"/>
                                    </p:inputText>
                                    <h:outputLabel for="fatorTmb" value="TMB (Taxa de Metabolismo Basal): " />
                                    <p:inputText id="fatorTmb" value="#{dietaBean.dieta.tmb}" readonly="true" maxlength="6"/>
                                    <h:outputLabel for="vet" value="VET (Valor Energético Total): "/>
                                    <p:inputText id="vet" value="#{dietaBean.dieta.vet}" readonly="true" maxlength="6"/>
                                </h:panelGrid>
                                <br/>
                                <p:commandButton id="btnRegDieta" value="Registrar Dieta" 
                                                 actionListener="#{dietaBean.save}" ajax="false" 
                                                 update="tabelaPessoas, hisDietaReg, grolRegDieta"> //aqui o dataTable, não atualiza...
                                    <p:ajax update="tabelaPessoas, hisDietaReg"/>
                                </p:commandButton>
                                <br/>

                            </h:panelGrid>
                            <h:panelGroup layout="block" id="tabelaPessoas">
                                <p:outputPanel>
                                    <p:dataTable id="hisDietaReg" var="dietaReg"
                                                 lazy="true" value="#{dietaBean.lista}"
                                                 emptyMessage="Nenhum Registro Encontrado" paginator="true"
                                                 paginatorAlwaysVisible="false" rows="5">
                                        <f:facet name="header">
                                            <h:outputText value="Histórico de Dietas Registradas"/>
                                        </f:facet>
                                        <p:column>
                                            <f:facet name="header">
                                                <h:outputText value="Peso (kg)" />
                                            </f:facet>
                                            <h:outputText value="#{dietaReg.peso}"/> 
                                        </p:column>
                                        <p:column>
                                            <f:facet name="header">
                                                <h:outputText value="Objetivo" />
                                            </f:facet>
                                            <h:outputText value="#{dietaReg.objetivoDieta}"/> 
                                        </p:column>
                                        <p:column>
                                            <f:facet name="header">
                                                <h:outputText value="VET" />
                                            </f:facet>
                                            <h:outputText value="#{dietaReg.vet}"/> 
                                        </p:column>

                                        <p:rowExpansion>
                                            <h:outputText value="Detalhamento" style="font-size: 20px; color: #009900"/>
                                            <h:panelGrid  columns="4" 
                                                          cellpadding="4"  
                                                          styleClass="ui-widget-content grid">

                                                <h:outputText value="Peso (kg): "/>
                                                <h:outputText  value="#{dietaReg.peso}"/>

                                                <h:outputText value="Atividade Física: "/>
                                                <h:outputText  value="#{dietaReg.peso}"/>

                                                <h:outputText value="Objetivo: "/>
                                                <h:outputText  value="#{dietaReg.objetivoDieta}"/>

                                                <h:outputText value="Adicionar Calorias (Kcal): "/>
                                                <h:outputText  value="#{dietaReg.adicionarCalorias}"/>

                                                <h:outputText value="Descontar Calorias (Kcal): "/>
                                                <h:outputText  value="#{dietaReg.descontarCalorias}"/>

                                                <h:outputText value="FA (Fator de Atividade): "/>
                                                <h:outputText  value="#{dietaReg.fatorAtividade}"/>

                                                <h:outputText value="TMB (Taxa de Metabolismo Basa):  "/>
                                                <h:outputText  value="#{dietaReg.tmb}"/>

                                                <h:outputText value="VET (Valor Energético Total): "/>
                                                <h:outputText  value="#{dietaReg.vet}" />
                                            </h:panelGrid>
                                        </p:rowExpansion>
                                    </p:dataTable>
                                </p:outputPanel>
                            </h:panelGroup>
                        </p:fieldset>
                    </p:tab>
                    <p:tab id="tab2" title="Montar Dieta">
                        <h:panelGrid columns="2">
                            <h:outputText value="VET (Valor Energético Total - Diário): "/>
                            <p:inputText id="vetTab2" value="#{dietaBean.dieta.vet}" readonly="true"/>

                            <h:outputText value="Total de Calorias da Dieta: "/>
                            <p:inputText id="tKcaldieta1"  value="#{dietaBean.totalKcalDieta}" readonly="true"/>
                        </h:panelGrid>
                        <br/>
                        <p:accordionPanel multiple="true">
                            <p:tab title="Montar Dieta">
                                <h:panelGrid columns="2">
                                    <h:outputText value="Selecione o tipo de refeição: "/>
                                    <p:selectOneMenu value="#{dietaBean.dietaItens.periodo}" style="width: 145px;">
                                        <f:selectItem  itemLabel=""/>
                                        <f:selectItem itemValue="Desejum" itemLabel="Desejum"/>
                                        <f:selectItem itemValue="Colação" itemLabel="Colação"/>
                                        <f:selectItem itemValue="Almoço" itemLabel="Almoço"/>
                                        <f:selectItem itemValue="Ceia" itemLabel="Ceia"/>
                                        <f:selectItem itemValue="Janta" itemLabel="Janta"/>
                                    </p:selectOneMenu>

                                    <h:outputText value="Selecionar Alimento: "/>
                                    <p:autoComplete id="aliDieDesj" value="#{dietaBean.alimento}" 
                                                    forceSelection="true" completeMethod="#{dietaBean.dc.searchAlimentos}" minQueryLength="3">
                                        <p:ajax listener="#{dietaBean.onSelectAlimento}" update="qntMed, qntGML, med" event="itemSelect"/>
                                    </p:autoComplete>
                                </h:panelGrid>
                                <br/>
                                <p:panel header="Dados do Alimento">
                                    <h:panelGrid columns="2">
                                        <h:outputText value="Tipo de Cálculo: "/>
                                        <p:selectOneRadio value="#{dietaBean.tipoCalculo}">
                                            <f:selectItem itemLabel="Medida" itemValue="Medida"/>
                                            <f:selectItem itemLabel="Peso (g/ml)"  itemValue="Peso"/>
                                            <p:ajax event="change" listener="#{dietaBean.onChangeTipoCalculo}" update="qntMed, qntGML"/>
                                        </p:selectOneRadio>
                                        <h:outputText value="Tipo de Medida: "/>
                                        <p:inputText id="med" value="#{dietaBean.medida}" readonly="true"/>
                                        <h:outputText value="Quantidade: "/>
                                        <p:spinner id="qntMed" value="#{dietaBean.qntMedida}" 
                                                   stepFactor="0.5" disabled="#{dietaBean.habQntMedida}"
                                                   min="0.5">
                                            <p:ajax event="change" listener="#{dietaBean.onChangeQnt}" update="qntGML, totalKcalAlim"/>
                                        </p:spinner>
                                        <h:outputText value="Gramas / Mililitros: "/>
                                        <p:inputText id="qntGML" value="#{dietaBean.qntGramaMili}" disabled="#{dietaBean.habQntGramas}">
                                            <p:ajax listener="#{dietaBean.onChangeGramas}" update="totalKcalAlim" event="change"/>
                                        </p:inputText>
                                        <h:outputText value="Kcal"/>
                                        <p:inputText id="totalKcalAlim" readonly="true" value="#{dietaBean.totalKcalAlimento}"/>
                                    </h:panelGrid>
                                </p:panel>
                                <p:commandButton id="btnSalvarDieta" value="Salvar Dieta" 
                                                 actionListener="#{dietaBean.saveDietaItens}" ajax="false"
                                                 update="hisDietaMon"/>
                            </p:tab>
                        </p:accordionPanel>

                        <span style="float: right">
                            <h:outputText value="Total de Calórias da Dieta: "/>
                            <p:inputText id="tKcaldieta" value="#{dietaBean.totalKcalDieta}" />
                        </span>
                        <br/><br/>
                        <p:dataTable id="hisDietaMon" var="dietaMontada" 
                                     lazy="true" value="#{dietaBean.listaItens}"
                                     emptyMessage="Nenhum Registro Encontrado" paginator="true"
                                     paginatorAlwaysVisible="false" rows="5"
                                     >
                            <f:facet name="header">
                                <h:outputText value="Histórico de Dietas Montadas"/>
                            </f:facet>
                            <!--
                            <p:column style="width: 4%">
                                <p:commandButton icon="ui-icon-trash" oncomplete="dialogDelalim.show()"/>
                            </p:column>
                            
                            <p:column selectionMode="multiple" style="width:18px" />  
                            -->
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Período" />
                                </f:facet>
                                <h:outputText value="#{dietaMontada.periodo}"/> 
                            </p:column>
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Alimento" />
                                </f:facet>
                                <h:outputText value="#{dietaMontada.alimento}"/> 
                            </p:column>
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Quantidade" />
                                </f:facet>
                                <h:outputText value="#{dietaMontada.quantidade}"/> 
                            </p:column>
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Medida" />
                                </f:facet>
                                <h:outputText value="#{dietaMontada.medidaPeso}"/> 
                            </p:column>
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Forma de Medida" />
                                </f:facet>
                                <h:outputText value="#{dietaMontada.formaMedidaPeso}"/> 
                            </p:column>
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="Calórias (kcal)" />
                                </f:facet>
                                <h:outputText value="#{dietaMontada.totalKcal}"/> 
                            </p:column>
                        </p:dataTable>
                        <p:dialog id="delAlimento" widgetVar="dialogDelalim"
                                  resizable="false" draggable="false"
                                  header="Excluir Alimento">

                        </p:dialog>

                    </p:tab>
                </p:tabView>
            </h:form>

        </ui:define>


    </ui:composition>



</html>

ManagedBean

 /*
     * Salvar calcDieta
     */
    public void save() {
        String msg;
        if (pacienteSelecionado.getIdUsuario() != null) {
            dieta.setTbUsuario(pacienteSelecionado);
            msg = dc.salvarCalcDieta(dieta);
            FacesContext contexto = FacesContext.getCurrentInstance();
            contexto.addMessage("btnRegDieta",
                    new FacesMessage(msg));
            RequestContext contextRequest = RequestContext.getCurrentInstance();
            contextRequest.update("hisDietaReg");
            refresh();
        } else {
            msg = "Favor, selecionar um paciente";
            FacesContext contexto = FacesContext.getCurrentInstance();
            contexto.addMessage("btnRegDieta",
                    new FacesMessage(msg));
        }

    }

 /*
     * Atualizar página
     */
    public void refresh() {
        FacesContext context = FacesContext.getCurrentInstance();
        Application application = context.getApplication();
        ViewHandler viewHandler = application.getViewHandler();
        UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
        context.setViewRoot(viewRoot);
        context.renderResponse();
    }

/*
     * Selecionando paciente
     */

    public void onSelectUser(SelectEvent event) {
        pacienteSelecionado = pc.searchUsersByName(paciente);
        lista = dc.buscaCalcDieta(pacienteSelecionado.getIdUsuario());
        listaItens = dc.searchItensDieta(pacienteSelecionado.getIdUsuario());
        Double total = 0.0;
        for (TbDietaItens x : listaItens) {
            total = total + x.getTotalKcal().doubleValue();
        }
        totalKcalDieta = total.toString();
    }