Ao clicar no cammandLink alterar contido em uma das colunas do datatable, conforme a tabela abaixo, o método #{solicitacaoController.listarSolictacaoes} no value do datable é executado um número indeterminado de vezes, fazendo com que tenha problema de performance, alguém sabe como resolver? O método está sendo executado sem mandar renderizar o DataTable
[code]<h:form id=“formTabela” >
<p:dataTable id="tabela" var="soli"
emptyMessage="Nenhum registro encontrado"
value="#{solicitacaoController.listarSolictacaoes}">
<p:column>
<f:facet name="header">
<h:outputText value="Alterar"/>
</f:facet>
<p:commandLink actionListener="#{solicitacaoController.prepararAlterarSolicitacao}" value="Alterar" update=":tabView:formCad:info" oncomplete="dialogGerLivro.show()"/>
</p:column>
<p:column>
<f:facet name="header" >
<h:outputText value="Sts"/>
</f:facet>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="N°"/>
</f:facet>
<h:outputText value="#{soli.codSolicitacao}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Assunto"/>
</f:facet>
<h:outputText value="#{soli.assunto}" />
</p:column>
</p:dataTable>
</h:form>[/code]
você está utilizando o actionEvent no seu managedBean?
ponha o atributo process="@this" no seu commandLink
Você colocou um if no listarSolictacaoes?
Esse comportamento é normal no jsf.
Faça algo do tipo
if(solicitacoes == null){
solicitacoes = new …
}
return solicitacoes;
[quote=kleberdamasco]você está utilizando o actionEvent no seu managedBean?
ponha o atributo process="@this" no seu commandLink[/quote]
Eu estou usando o actionEvent , no entanto, colocando o process="@this" no commandLink não funcionou.
Nessa caso, vou ficar com a sugestão dada pelo Hebert, apesar de que acho que seria mais interessante se problema pudesse ser tratado na view pelo primefaces.
Obrigado.
a opção de process this, foi apenas para não processar seu form todo. A assinatura do seu metodo no managedBean
é retorno nome(ActionEvent evento) {
…
}
?
[quote=kleberdamasco]a opção de process this, foi apenas para não processar seu form todo. A assinatura do seu metodo no managedBean
é retorno nome(ActionEvent evento) {
…
}
?[/quote]
Sim, está dessa forma:
public void prepararAlterarSolicitacao(ActionEvent actionEvent) {
obSolicitacao = (Solicitacao) (listaSolicitacoes.getRowData());
}
E vc usa o objeto actionEvent?
isso não vai resolver seu problema, é apenas uma dica,
não precisar ter então, e lá no xhtml chamar o action mesmo.
[quote=kleberdamasco]E vc usa o objeto actionEvent?
isso não vai resolver seu problema, é apenas uma dica,
não precisar ter então, e lá no xhtml chamar o action mesmo. [/quote]
Realmente actionEvent nem tem utililidade nesse caso, então eu troquei para o action só para testar, e continua a mesma coisa.
Ao clicar no commandLink o método no value do dataTable é chamado cerca de 20 vezes.
[quote=marcos1EM][quote=kleberdamasco]você está utilizando o actionEvent no seu managedBean?
ponha o atributo process="@this" no seu commandLink[/quote]
Eu estou usando o actionEvent , no entanto, colocando o process="@this" no commandLink não funcionou.
Nessa caso, vou ficar com a sugestão dada pelo Hebert, apesar de que acho que seria mais interessante se problema pudesse ser tratado na view pelo primefaces.
Obrigado.[/quote]Isso não é problema, é comportamento de um framework component based.
Isso é o comportamento esperado.
O que eu costumo fazer e colocar no value do datatable sempre uma propriedade, que e representada no bean por um metodo get que simplesmente retorna uma lista. O metodo que efetivamente faz a busca no banco eu coloco em um postconstruct ou entao num daqueles f:event preRenderView.
Como o Hebert disse, e da natureza do JSF chamar varias vezes o metodo que popula a tabela, por isso evite colocar consulta ao banco nesses metodos.
Entendido, Obrigado pelas dicas!