[RESOLVIDO] Manter objeto vivo após request com primefaces

12 respostas
A

Desde já agradeço a todos do fórum que puderem oferecer alguma sugestão. Meu problema é o seguinte; ao abrir a página o managed bean responsável por ela executa uma
named query no construtor que preenche um datalist, O usuário seleciona um objeto do datalist que é enviado como parametro para uma segunda query que preenche um
datatable. Até aí tudo funciona; o terceiro passo seria pegar um objeto desse datatable e executar uma terceira named query, mas quando eu chamo o metodo getSelection do
datatable ele retorna null.
Se eu uso o managed bean com escopo de sessão o metodo getSelection funciona, mas eu preciso usar o escopo Request, por causa do binding. Alguma idéia de como pegar
o valor da linha selecionada no datatable??
Acredito que o problema é que eu perco os valores do datatable ao fazer o request, por isso acredito que se conseguir se conseguir manter o objeto vivo consigo pegar a seleção

12 Respostas

P

Olá
Se voce estiver usando JSF2.0 use o escopo ViewScoped. Espero ter ajudado.

A

Eu tentei usar o view scoped, mas não funcionou…

Hebert_Coelho

Para o ViewScoped funcionar você deve utilizar CDI ao invés dos managedBeans normais.

A

Obrigado pelas dicas, vou ter que estudar um pouco mais sobre CDI, mas por hora consegui resolver uma parte do problema usando o <f:param>. Existe algum componente JSF que
permita enviar ao invés de uma String como o <f:param>, um objeto? No meu caso uma seleção num Datatable?

Hebert_Coelho

Faça no seu MB um atributo com get/set e na sua tela coloque os campos uai.

public classe MeuMB{

private Car carro. // get/set

}

e na sua tela você colocaria inputHidden ou utilizaria os campos da tabela
<h:inputHidden value="#{carro.cor}"

Ao chamar o MB o JSF irá popular tudo para vc.

A

O problema é que o managed bean é request scoped, o componente datatable de onde quero selecionar um objeto é populado depois de uns dois requests na mesma página(duas named queries), e quando chamo o método getSelection do datatable ele retorna null.

Hebert_Coelho

Você falou dois requests. Está mudando de página? Se sim você precisar enviar novamente os dados do objeto.

A

Não, na verdade eu realizo esses dois requests na mesma pagina. Um request é para executar uma named query e pegar um objeto, que eu passo como parametro para executar uma
segunda named query, que popula um datatable. No terceiro request, eu tento pegar um objeto do datatable, mas o getSelection vem null. Tudo isso numa página só.

vinnysoft

Boa noite!

Uma ideia: não precisa mudar o ManagedBean para o escopo sessão, mas usar o SessionMap para enviar o parâmetro que vc quer. Ex:

Object objEnvio = new Object();
    
    //Para enviar ao mapa da sessão.
    FacesContext contexto = FacesContext.getCurrentInstance();
    contexto.getExternalContext().getSessionMap().put("meuObjeto", objEnvio);
    
    //Para pegar do mapa da sessão.
    Object objRecebimento = contexto.getExternalContext().getSessionMap().get("meuObjeto");

Isso faz com que somente o parâmetro que vc precisa fique disponível na sessão, e não todo seu ManagedBean.

Tente também com o RequestMap e o ApplicationMap.

Até +!

A

Obrigado pela dica, vou tentar usando o FacesContext…

A

Obrigado a todos pelas dicas, consegui resolver o problema setando minha lista de objetos diretamente no datatable através do binding " dataTableProposicao.setValue(listaAnalise) ". Ele aparentemente não possuia nenhum objeto para selecionar, embora os dados dos objetos aparecessem na tela. Agora é possível usar o getSelection. Obrigado.

vinnysoft

Que bom que resolveu! Então edita o seu primeiro post e coloca [RESOLVIDO] :thumbup:

Até +!

Criado 29 de novembro de 2011
Ultima resposta 1 de dez. de 2011
Respostas 12
Participantes 4