Primefaces + JSF2.0 - p:dataTable - o método get é executado varias vezes no lifeCycle

16 respostas
T

Comecei a trabalhar a pouco tempo com jsf e acabei me deparando com uma situação que me preocupou um pouco, ao debugar a paginação do componente p:dataTable percebi que o método get que carrega a lista para o dataTable é executado varias vezes dentro de um único clico de vida.

Tem como evitar que isso ocorra?

Aplicação roda no apache tomcat 7.

16 Respostas

K

é normal executar varias vezes o(s) método(s) get()
dos atributos.

T

kleberdamasco:
é normal executar varias vezes o(s) método(s) get()
dos atributos.

Mas tem como evitar? Pois o metodo get esta com a logica da paginação e acaba executando a query varias veses.

K

tjalencar:
kleberdamasco:
é normal executar varias vezes o(s) método(s) get()
dos atributos.

Mas tem como evitar? Pois o metodo get esta com a logica da paginação e acaba executando a query varias veses.

estás usando o lazy?

tens como colocar o método get() ?

em resumo seria mais ou menos assim

public object seuMetodoGet() {

if(object == null) {
object = new Object();
}

return object;
T

kleberdamasco:

estás usando o lazy?

tens como colocar o método get() ?

Não estou usando o lazy. o problema não esta no get, o problema é ele ser executado varias vezes, em um único ciclo de vida, quando repagina o dataTable ele executa todos os ciclos e o método executa varias vezes em cada ciclo.

D

tjalencar:
kleberdamasco:

estás usando o lazy?

tens como colocar o método get() ?

Não estou usando o lazy. o problema não esta no get, o problema é ele ser executado varias vezes, em um único ciclo de vida, quando repagina o dataTable ele executa todos os ciclos e o método executa varias vezes em cada ciclo.

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.

K

ficaria mais fácil se você colocasse o seu método get()
para dar uma olhada!

T

diegosammet:

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.

Amigo eu sei o que é o ciclo de vidas e sei como funciona, o que estou questionando é múltipla execução dentro de um ciclo de vida, mesmo com o @PostConstruct acontece a mesma coisa.

Não teria vindo aqui questionar uma coisa sem ter efetuado vários testes.

Esta tudo funcionando perfeitamente, só criei o tópico para intender o que esta ocorrendo.

K

você poderia colocar o seu método get()?

D

tjalencar:
diegosammet:

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.

Amigo eu sei o que é o ciclo de vidas e sei como funciona, o que estou questionando é múltipla execução dentro de um ciclo de vida, mesmo com o @PostConstruct acontece a mesma coisa.

Não teria vindo aqui questionar uma coisa sem ter efetuado vários testes.

Esta tudo funcionando perfeitamente, só criei o tópico para intender o que esta ocorrendo.

O problema é o NOME do método, entendeu? Qualquer método GET que esteja no MB é executado várias vezes, se você tiver as consultas dentro de um get ele irá executar N vezes e não a nada que você possa fazer sobre isso.

T

kleberdamasco:
ficaria mais fácil se você colocasse o seu método get()
para dar uma olhada!

public DataModel<Usuario> getUsuarios() {
		UIData tabela = getTabela("formManterUsuario","tabelaManterUsuarios");
		int primeiroReg = -1;
		int paginaSize = -1;
		if(tabela==null){
			primeiroReg = 1;
			paginaSize = 5;
		}else{
			primeiroReg = tabela.getFirst();
			paginaSize = tabela.getRows();
		}
		try {
			if(totalRegistros ==0){
				totalRegistros=usuarioController.pesquisarPorFiltroCount(filtro);
			}
			listaUsuarios = usuarioController.pesquisarPorFiltro(filtro,primeiroReg,paginaSize);
			this.usuarios = new GenericDataModel<Usuario>(listaUsuarios, totalRegistros, paginaSize);
		} catch (UsuarioException e) {
			addMessage(e.getMessage());
		}
		
		return usuarios;
	}
        public List<Usuario> getListaUsuarios() {

		return listaUsuarios;
        }

Tanto em um método como no outro ocorre a mesma coisa.

o GenericDataModel é uma extensão de DataModel

T

diegosammet:

O problema é o NOME do método, entendeu? Qualquer método GET que esteja no MB é executado várias vezes, se você tiver as consultas dentro de um get ele irá executar N vezes e não a nada que você possa fazer sobre isso.

valeu.

J

diegosammet:
tjalencar:
diegosammet:

Então não faça de jeito oras… Isso é do ciclo de vida do JSF e não tem como evitar… Crie sua lista; e popule-a ( Logica + Queries) no construtor do seu MB, ou em um método anotado com @PostConstruct. No get você só retorna a lista.

Amigo eu sei o que é o ciclo de vidas e sei como funciona, o que estou questionando é múltipla execução dentro de um ciclo de vida, mesmo com o @PostConstruct acontece a mesma coisa.

Não teria vindo aqui questionar uma coisa sem ter efetuado vários testes.

Esta tudo funcionando perfeitamente, só criei o tópico para intender o que esta ocorrendo.

O problema é o NOME do método, entendeu? Qualquer método GET que esteja no MB é executado várias vezes, se você tiver as consultas dentro de um get ele irá executar N vezes e não a nada que você possa fazer sobre isso.

Pode sim cara!!! Sai do JSF :twisted:

D

Claro, parar de usar um framework só pra evitar um :

lista = metodoQuePopulaLista();

no construtor? No, thanks…

J

Claro, parar de usar um framework só pra evitar um :

lista = metodoQuePopulaLista();

no construtor? No, thanks…

aiai camarada, se fosse só isso… 8)

Algumas pessoas que também pensam igual:

http://ihatejsf.com/

D

Ó Haters, se soubessem que 90% dos problemas do JSF é falta de estudo, tudo seria mais fácil. Anyway, falando sério agora. JSF não é perfeito, não é bala de prata, não resolve todos os problemas do mundo, mas cumpre com propriedade o que foi projetado para fazer… É só aprender de VERDADE como fazer.

J

Só sei de uma coisa Component Based FW nunca mais…

Tá bom se for por muita grana to dentro. :oops:

Criado 3 de janeiro de 2013
Ultima resposta 3 de jan. de 2013
Respostas 16
Participantes 4