Re: [CEJUG] como poderia solucionar a chamada do mesmo método várias vezes. JSF, CDI , Primefaces

186 views
Skip to first unread message

Rafael Ponte

unread,
Apr 30, 2015, 8:50:46 AM4/30/15
to ce...@googlegroups.com
Oi Nalomy,

A regra geral e boa prática com JSF é: não coloque lógicas custosas em métodos getters.

Se precisar colocar, você precisa fazer um pequeno cache dentro do método para garantir que a lista foi carrega somente uma única vez na mesma requisição ou sessão. Pelo visto você já fez isso no seu método getter!

Enfim, não há como evitar as chamadas dos métodos getters pelo framework, isso pode ser ainda pior quando trabalhamos com componentes de iteração, como h:dataTable ou ui:repeat, por exemplo. E pode variar ainda mais dependendo da implementação JSF que você usa (Mojarra ou MyFaces).

Siga a boa prática e você não terá problemas!

Um abraço!


2015-04-30 9:02 GMT-03:00 Nalomy Souza <nalom...@gmail.com>:
Bom dia. Estou com uma dúvida em relação ao "processo de requisição" chamar o mesmo método várias vezes.

Estava fazendo 'debug' em uma aplicação, ao fazer uma requisição para a página que retorna uma "Lista de Usuários", o método que retorna a lista é chamado três vezes.

O pior acontece quando existe um processo de exclusão, chega a chamar inúmeras vezes o método de listar após a exclusão.

em anexo minha classe, a datatable, e os logs gerados ao listar e excluir.

Aplicação está usando
weld-servlet (2.2.9.Final) implementação CDI
javax.faces (2.2.9)
primefaces (5.1)


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.
---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Rafael Ponte

unread,
Apr 30, 2015, 9:43:16 AM4/30/15
to ce...@googlegroups.com
Oi Nalomy,

Vou tentar explicar com um exemplo:

Imagine que o método abaixo possui um value-binding numa h:dataTable, por exemplo:
public List<Cargo> getCargos() 
    return service.findAll(); // processo custoso
}

O método acima pode e provavelmente irá ser chamado diversas vezes durante uma requisição. O que está acontecendo é perfeitamente esperado, a própria especificação comenta sobre essa possibilidade. O número de vezes que um método getter é chamado não depende somente do número de vezes que uma EL é declarada (aparece) na página. Ele também depende do ciclo de vida (que pode chama-lo quantas vezes for necessário) e do componente que tem a referência a esta EL.

Por exemplo, um h:inputText pode ter sua EL chamada de 2 a 4 vezes ou até mais durante o ciclo de vida (conversão, validação, t:saveState etc). E isso pode variar para mais ou menos dependendo da implementação do JSF que está em uso (Mojarra ou MyFaces)!

Um componente de iteração como h:dataTable ou ui:repeat são os campeões nisso! Além da lista (neste caso cargos) todos os componentes internos do ht:dataTable que possuem EL são executados diversas vezes dependendo do número de linhas e colunas.

Enfim, a boa prática é: Não coloque processamento custoso nos métodos getters, pois isso é uma má prática se tratando de JSF. Se for realmente necessário então garanta ao menos que o processamento somente será executado uma vez por request.

Você consegue isso utilizando um calllback como @PostConstruct ou carregue a lista de cargos em um método disparado por um evento de um componente (h:commandButton por exemplo).

Se for necessário que o código fique no getter então faça algo do tipo:
public List<Cargo> getCargos() {
    if (cargos == null)
        cargos = service.findAll();
    return cargos;
}

O código acima garante que o .findAll() será executado somente uma vez numa mesma requisição.

Um abraço!

2015-04-30 10:19 GMT-03:00 Nalomy Souza <nalom...@gmail.com>:
Opa Rafael, agradeço pela contribuição e pelas dicas!

Não tenho tanta experiência e me preocupo bastante com a performance e segurança da aplicação. Por isso, estou tentando compreender os impactos desse processo de várias chamadas ao método na aplicação, mesmo colocando uma "garantia" de que a lista não será chamada várias vezes. 

Esse "problema" poderia ser por conta do ciclo de vida do JSF? gostaria de entender melhor sabe.

Mais uma vez, obrigado!

abraço
Att,

--
Nalomy de Souza Alves
Programador Pleno 
Célula da Tecnologia da Informação
Secretaria da Cultura do Estado do Ceará
Cell: (85)8936-6442 

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.
---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.

Jocelio Lima

unread,
Apr 30, 2015, 9:43:30 AM4/30/15
to Cejug
Olá Nalomy, 
acho que pode ajudar a entender um pouco mais sobre o ciclo de vida do jsf,

Em 30 de abril de 2015 10:19, Nalomy Souza <nalom...@gmail.com> escreveu:
Opa Rafael, agradeço pela contribuição e pelas dicas!

Não tenho tanta experiência e me preocupo bastante com a performance e segurança da aplicação. Por isso, estou tentando compreender os impactos desse processo de várias chamadas ao método na aplicação, mesmo colocando uma "garantia" de que a lista não será chamada várias vezes. 

Esse "problema" poderia ser por conta do ciclo de vida do JSF? gostaria de entender melhor sabe.

Mais uma vez, obrigado!

abraço
Em 30 de abril de 2015 09:50, Rafael Ponte <rpo...@gmail.com> escreveu:



--
Att,

--
Nalomy de Souza Alves
Programador Pleno 
Célula da Tecnologia da Informação
Secretaria da Cultura do Estado do Ceará
Cell: (85)8936-6442 

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.
---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--

Jocélio Lima - Analista de Sistemas

Everton Patricio Pereira

unread,
May 1, 2015, 5:50:58 AM5/1/15
to ce...@googlegroups.com
Olá Nalomy,

Isso é um bug do JSF. Adicione esse parâmetro na sua página que provavelmente o problema será resolvido:

     <f:metadata>
           <f:viewParam name="dummy" />
     </f:metadata>


Uma das referências:
 
 
image
 
 
 
 
 
JSF preRenderView called too many times
A page/bean of mine has its preRenderView event fired twice on the first page load then 2 + n times for each postback, where n is the number of postbacks (including...
Visualizado por Yahoo
 

Boa sorte!
 
Everton Patricio Pereira

Everton Patricio Pereira

unread,
May 2, 2015, 2:55:41 PM5/2/15
to ce...@googlegroups.com
Olá Nalomy,

Tenda implementar das duas formas (com a que vc encontrou e com a que eu te indiquei) e faz uma análise de qual solução é mais interessante ou se as duas são equivalentes. Se possível, coloca o resultado aqui no grupo.

Obrigado, 
Everton.
 
Everton Patricio Pereira



Em Sexta-feira, 1 de Maio de 2015 10:01, Nalomy Souza <nalom...@gmail.com> escreveu:


Opa Everton, implementei uma solução bem parecida. Porém, utilizando Omnifaces. É bastante interessante e já ameniza todo esse processamento.

Agradeço pela dica e vou dar uma olhada no link citado!

abraço e bom feriado!

Everton Patricio Pereira

unread,
May 6, 2015, 9:58:54 PM5/6/15
to ce...@googlegroups.com
Obrigado pelo retorno Nalomy! Que possamos compartilhar nossos conhecimentos e assim melhorar nossa realidade e a realidade dos nossos amigos CEJUG. Sucesso! 

Obrigado,
Everton.
 
Everton Patricio Pereira



Em Quarta-feira, 6 de Maio de 2015 19:19, Nalomy Souza <nalom...@gmail.com> escreveu:


Boa noite Everton, desculpa a demora.
 
Ambos as solução produzem resultados semelhantes. Porém utilizando o omnifaces, permite Injetar um parâmetro de solicitação HTTP em um bean gerenciado CDI, achei bem vantajoso para mim :D

abraço
Reply all
Reply to author
Forward
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
0 new messages