JSF Primefaces onCellEdit OldValue e NewValue são iguais

Amigos,

Depois de muito sofrer, encontrei muitos problemas parecidos com o meu, tanto no guj quanto no stackoverflow. Mas nenhuma solução…

Estou tentando implementar isto: http://www.primefaces.org/showcase/ui/datatableCellEditing.jsf

Mas claro, gravar no banco de dados. Pra isso, preciso do valor que foi inserido e não sei o que estou fazendo de errado.

abaixo meu .jsf

<p:contextMenu for="chamados" widgetVar="cMenu">     
                <p:menuitem value="Edit Cell" icon="ui-icon-search" onclick="PF('chamadosTable').showCellEditor(); return false;"/>    
                <p:menuitem value="Hide Menu" icon="ui-icon-close" onclick="PF('cMenu').hide()"/>    
            </p:contextMenu>

            <p:dataTable id="chamados" var="chamado" value="#{chamadoController.listarChamados}" editable="true" editMode="cell" widgetVar="chamadosTable">
              

                <p:ajax event="cellEdit" listener="#{chamadoController.onCellEdit}" process="@this" update=":form:messages" />

                <p:column headerText="Requestor" style="width:25%">  
                    <p:cellEditor>  
                        <f:facet name="output"><h:outputText value="#{chamado.requestor}" /></f:facet>  
                        <f:facet name="input"><p:inputText id="requestorInput" value="#{chamado.requestor}" style="width:96%"/></f:facet>  
                    </p:cellEditor>  
                </p:column>  
            </p:dataTable>

Meu método do MB

public void onCellEdit(CellEditEvent event) {
        System.out.println(event.getNewValue());
        System.out.println(event.getOldValue());
          
    }

Ambos imprimem o valor ANTIGO.

Um outro fato estranho, a célula modificada só fica modificada quando a seleciono(clicko em cima dela), quando clicko fora, o valor antigo aparece novamente.

Obrigado e abraços!

Qual versão do Primefaces está utilizando, se não me engano a partir da versão 4.0, tem os eventos abaixo que podes usar para atualizar o datatable:

rowEditInit - Quando uma linha muda para o estado de edição.
rowEditCancel - Quando a edição de uma linha é cancelada.
rowEdit - Quando a linha é editada.

Veja ai se algum desses eventos pode ser útil pra resolver o problema.

Só uma pergunta, você relatou que old e newValue estão iguais, você alterou os valores antes de fazer o teste, certo?

Bom dia, Guilherme!

Estou fora de casa, e não tenho como testar os eventos citados, mas tentarei em breve e te deixarei saber.

Quanto a sua pergunta: Sim, fiz um teste para que dispare no console uma mensagem imprimindo ambos os valores. Quando faço a alteração, aparecem duas vezes o valor antigo.

Eu tinha este problema também, mas acabei resolvendo. Fiz como indicava o Showcase do Primefaces. Para mim o problema é que estava utilizando um form para outro componente dentro do form principal e, quando chamava este (update=":equipeForm:msgs"), por algum motivo, não atualizava o novo valor da célula da tabela. Acabei alterando, retirando este form do outro componente e funcionou certinho. Li em alguns fóruns que a utilização da propriedade “process” pode causar erros nesta atualização de valores também.

Ficou assim (parte da página):

index.jsf

 <h:form id="equipeForm" >
         <p:growl id="msgs" showDetail="true"/>
         <p:dataTable id="tabelaResultados" 
                var="confrontos" 
                value="#{equipeBean.confrontos}"
                editable="true" editMode="cell">

                 <p:ajax event="cellEdit"  listener="#{equipeBean.onCellEdit}" update=":equipeForm:msgs"/>

                 <p:column id="PontosCasa" headerText="Pontos Casa" styleClass="ui-editable-column">
                      <p:cellEditor>
                      <f:facet name="output">
                           <h:outputText  value="#{confrontos.pontosCasa}"/> 
                      </f:facet>
                      <f:facet name="input">
                           <h:inputText rendered="#{confrontos.diferencaPontos != 0}" 
                                  value="#{confrontos.pontosCasa}" 
                                  label="Pontos Casa"> 
                                  <f:convertNumber maxFractionDigits="0" /> 
                           </h:inputText>
                       </f:facet>
                       </p:cellEditor>
                  </p:column>
           </p:datatable>
</h:form>

método no Bean EquipeBean

public void onCellEdit(CellEditEvent event) { Object oldValue = event.getOldValue(); Object newValue = event.getNewValue(); if (newValue != null && !newValue.equals(oldValue)) { FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue); FacesContext.getCurrentInstance().addMessage(null, msg); } }

Espero ter ajudado alguém…