[RESOLVIDO]Metodos JSF chamados diversas vezes no ManagedBean

Olá amigos, tenho uma aplicação feita em JSF + Richfaces e banco de dados MySql sem o uso do hibernate ( a pedido do meu chefe ).

E tenho metodos de busca por exemplo, que são chamados nos meus beans varias vezes, checo isso atraves de um contador.

Vi varios posts relacionados a isso, mas as soluções eram para projetos com auxilio do hibernate.

Há alguma solução para o meu projeto?

Irei postar os trechos de codigo de uma das consultas:

Isto ai é do meu BEAN, o metodo é chamado da fachada -> que chama do web service ( mas o pro pelo q vejo é no ciclo de vidas do JSF mesmo, acho que não estou entendendo direito):

public List<Projeto> obterProjetos() { projetos = new ArrayList<Projeto>(); projetos = Facade.getInstance().getProjetos(); return projetos; }

Isso é meu componente dataTable que chama esse metodo:

<r:dataTable id="projeto" border="1" rendered="#{not empty projetoBean.obterProjetos() }" value="#{projetoBean.obterProjetos() }" var="p" rows="10" cellspacing="1" width="100%"> <f:facet name="header"> <h:outputText value="Lista de Projetos"></h:outputText> </f:facet> <r:column> <f:facet name="header"> <h:outputText value="Id"></h:outputText> </f:facet> <h:outputText value="#{p.id }"></h:outputText> </r:column> <r:column sortBy="#{p.nome }" sortOrder="ASCENDING" filterValue="#{projetoBean.nomeFiltro }" filterBy="#{p.nome }" filterEvent="onkeyup"> <f:facet name="header"> <h:outputText value="Nome"></h:outputText> </f:facet> <h:outputText value="#{p.nome }"></h:outputText> </r:column> ...

O que está acontecendo? Os dados não estão carregando? Está dando algum erro?

Não amigo, está perfeito a vinda dos dados, o problema é que ele chama o metodo de busca umas 8 vezes, dai demora para a dataTable ser preenchida.

Veja se esta solução te auxiliará, e dê uma lida sobre o cliclo de vida so JSF, isso ajuda bastante quando aparecer algo assim:
no teu método obterProjetos(), deixe-o como getObterProjetos(), assim ao chamá-lo no:

<r:dataTable id="projeto" border="1"  
                    rendered="#{not empty projetoBean.obterProjetos() }"  
                    value="#{projetoBean.obterProjetos() }" var="p" rows="10" cellspacing="1"  
                    width="100%">  
.
.
.

a lista será carregada automaticamente. Sempre que você criar uma lista para ser exibida na tua view, adicione o getNomeDoTeuMetodo() que assim você não necessitará de carregá-lo anteriormente, ele saberá que aquele método trata de um retorno apenas, assim como funciona no padrão javabean. Desta forma você fará apenas uma requisição ao teu backbean.
Veja se isso ajuda um pouco.

Ola amigo, eu ja estava trabalhando utilizando esse metodo, o proprio metodo get da lista de projetos o getProjetos() era o metodo chamado pelo meu dataTable, dai lendo um pouco percebi que o pessoal ficava dizendo para não fazer nada nos metodos gets do atributo da lista.

Dai por isso fiz o metodo obterProjetos.

Olha ai como estava:

public List<Projeto> getProjetos() { projetos = new ArrayList<Projeto>(); projetos = Facade.getInstance().getProjetos(); return projetos; }

e no jsf:

<r:dataTable id="projeto" border="1" rendered="#{not empty projetoBean.projetos }" value="#{projetoBean.projetos }" var="p" rows="10" cellspacing="1" width="100%"> <f:facet name="header"> <h:outputText value="Lista de Projetos"></h:outputText> </f:facet> ...

Cara, jah pesquisei pela net e pelo que li isso eh coisa do ciclod e vida do JSF () que por mais que eu leia nao compreendo tudo desse troco) …

Lendo por ai, algumas pessoas dizem que eh uma boa maneira de lidar com isso é verificar a lista antes de fazer a consulta no BD, c ela estiver vazia pesquisa, caso contrario soh dah um return do que estiver na mesma, funciona bem quando o escopo do bean eh de request, evitando esse monte de consulta desnecessaria

Olá amigo, consegui resolver, as duas dicas foram importantes, ler a documentação me mostrou que existe um camarada pra definir a sessão como ViewScoped, rapa nem te conto, pense num cabra arretado, seguinte:

Coloquei para verificar se tava null ou vazia, dai se tava então carrega os itens e mostra na dataTable, caso contrario retorna a lista normalmente.

Quando atribui o request scoped, ele chamou n 8 mas umas 4 vezes, dai ainda achei ruim e vi esse ViewScoped.

Fica a dica ai,

resolve com uma solução simples.

Os 2 amigos ai me ajudaram muito, obrigado!!!