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
[RESOLVIDO] Manter objeto vivo após request com primefaces
12 Respostas
Olá
Se voce estiver usando JSF2.0 use o escopo ViewScoped. Espero ter ajudado.
Eu tentei usar o view scoped, mas não funcionou…
Para o ViewScoped funcionar você deve utilizar CDI ao invés dos managedBeans normais.
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?
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.
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.
Você falou dois requests. Está mudando de página? Se sim você precisar enviar novamente os dados do objeto.
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ó.
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é +!
Obrigado pela dica, vou tentar usando o FacesContext…
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.
Que bom que resolveu! Então edita o seu primeiro post e coloca [RESOLVIDO] :thumbup:
Até +!