Você já percebeu esse comportamento na maioria dos componentes do RichFaces? [RESOLVIDO]

12 respostas
neeryck

Srs.
Notei que o rich:inplaceSelect e rich:picklist chamam mais de duas vezes o método do managed-bean para cada renderização! Sem contar a submissão!
Sendo assim, faço uns 4,5 selects desnecessariamente contando a renderização e submissão.

Alguma sugestão?? Devo estar errando em algo…

[]'s

12 Respostas

neeryck

Na submissão dá erro de validação… e isso só me acontece com esses componentes…
Ninguém teve essa esperiência com o richfaces??

[]'s

neeryck

Pesquisando na cominudade JBoss, notei que o rich:inplaceSelect tem alguns bug’s… mudei para rich:combobox =D Não entra duas vezes no método que popula-o e é mais elegante!

Mais se alguém notou isso (acessar duas ou + vezes o método que popula o componente) e queira ajudar/discutir sobre tal assunto… será muito proveitoso!

[]'s

alves.Felipe

todos os componentes acontece isso tb… por exemplo o h:SelectOneMenu, tb passa algumas x no método getAlgumaCoisa()…
vc tem que tratar para não consultar várias x… nesse caso não é uma boa prática deixar a consulta dentro do método getAlgumaCoisa()…
entende?

neeryck

alves.Felipe

Agradeço muito pela resposta! Agora entendi que é de fato um comportamente do componente.
Ainda não imaginei um jeito de fazer isso. Por exemplo, se eu tiver um List com os dados, em algum momento (para renderização do componente) terei que chamar esse método, e tendo em vista que quando ele é submetido faz o mesmo procedimento…

Se possível dê uma dica para que eu possa evitar (SELECT’S, JOIN’S) desnecessárias consultas.

Muito obrigado pela atenção!

[]'s

alves.Felipe
getLista()
{
     if(lista==null)
      {
               consulta()
      }
       return lista;
}
neeryck

alves.Felipe:
getLista() { if(lista==null) { consulta() } return lista; }

Então… se eu tiver algo do tipo:

<td width="100%">
                                                    <rich:pickList value="#{beanOne.selected}"  //  beanOne -> private List<String> selected;
                                                                   copyAllControlLabel="Copiar todos" 
                                                                   copyControlLabel="Copiar"
                                                                   removeAllControlLabel="Remover todos"
                                                                   removeControlLabel="Remover"
                                                                   switchByClick="false" 
                                                                   sourceListWidth="250"
                                                                   targetListWidth="250">

                                                        <f:selectItems id="selectList" value="#{beanTwo.getList}" /> beanTwo -> preencherá minha lista de selectItem
                                                        
                                                        
                                                    </rich:pickList>
                                               //Para isso precisarei de um hidden certo??
                                              <h:inputHidden id="selectListHidden" value="#{beanTwo.selectList}" /> // beanTwo -> private List<SelectItem> selectList;
                                                </td>

Esse é meu cenário… estoura uma :

Cannot convert [javax.faces.model.SelectItem@1fddb33......

...of type class java.lang.String to interface java.util.List.

Por favor, como vc faria/faz alves.Felipe ??

Não quero fazer gambi :smiley:
Muito obrigado!

[]'s

alves.Felipe

me mostra como que esta o getList no seu bean…

neeryck

Claro!!

public List<SelectItem> getList() {
		
		try {
			
			if(this.selectList == null) { //Como vc me ensinou!
			
                          this.selectList = new ArrayList<SelectItem>();
			/// método para pegar do banco aqui 

				for(int i = 0; i < listaUserDao.size(); i++) {			
					
					this.selectList.add( new SelectItem( listaUserDao.get(i).getId(), listaUserDao.get(i).getName() ) );
					
				}

			}
			//
			return this.selectList;
			
		} catch(Exception e) {
			///..........
			return null;
		}
		
	}

Mas será que o problema ta aí??

Muito obrigado mesmo!

[]'s

neeryck

Srs.
Deu certo!
Agora, se eu já tenho os dados para que vou fazer um (ainda que apenas um) SELECT quando o form for submetido atravéz do <h:commanButton> ???
Da para contornar isso? Ou melhor fazer assim mesmo?
Não sei criar Conversor para List… acho que precisa pegar o objeto atravéz do hash tendo em vista que na classe que implementa Converter ela vem como String :smiley:

Como vcs fazem? SELECT? Ou reaproveitam o que tem?

[]'s

alves.Felipe

cada vez que for submetido o form, ai refaz as consultas… normal…
só não é normal ficar refazendo várias vezes a mesma consulta quando esta reenderizando a tela… certo?!

neeryck

Correto alves.Felipe !!
Muito obrigado pela força!

[]'s

D

neeryck:
Srs.
Notei que o rich:inplaceSelect e rich:picklist chamam mais de duas vezes o método do managed-bean para cada renderização! Sem contar a submissão!
Sendo assim, faço uns 4,5 selects desnecessariamente contando a renderização e submissão.

Alguma sugestão?? Devo estar errando em algo…

[]'s

Srs, boa tarde, Tenho trabalhado num projeto com Richfaces e tivemos uns problemas parecidos: Um botão a4j:commandButton que, através do rerender, disparava a atualização de meu rich:dataTabel. Exatamente como falaram, o método getDataModel de meu managed bean era chamado várias vezes durante a renderização do dataTable.

Ainda estou buscando uma resposta consistente para este problema, mas utilizar os atributos ajaxSingle e process do meu a4j:commandButton fez com que o mesmo parasse de repetir a chamada ao getDataModel.

Acho que vale como histórico para o problema, quando outros colegas pesquisarem…

Abc
Darcio

Criado 24 de maio de 2010
Ultima resposta 1 de out. de 2010
Respostas 12
Participantes 3