[quote=vinnysoft]Olá ericktb.
Sim você pode utilizar o keep no EL dessa forma mesmo.
Se vc não conseguir utilizar o flash, outra idéia seria utilizar o mapa de parâmetros do escopo da sessão, que dura enquanto o usuário estiver com a sessão ativa. Então vc não passaria o objeto para o outro bean, mas sim o ID do seu objeto, e este outro bean trataria de receber o id no @PostConstruct e buscaria ele do seu BD/DAO/Negócio/etc para exibir na tela.
Ex (supondo que sua lista está em um dataTable):
Pagina da Lista
<h:commandLink value="Editar" action="listaBean.editar">
<f:param name="id" value="#{varObjeto.id}"/>
</h:commandLink>
ListaBean
public String editar()
{
//Pega o id do objeto enviado no click do link "Editar"
long id = Long.valueOf(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"));
//Insere o id no escopo de sessão
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("meuObjetoId", id);
//Retorna o endereço da pagina de edicao para realizar a navegação...
return "/paginaEdicao?faces-redirect=true";
}
EdicaoBean
private Object meuObjeto;
/**
* Método executado na inicialização do Bean.
*/
@PostConstruct
public void inicializar()
{
try
{
if (FacesContext.getCurrentInstance().getExternalContext().getSessionMap().containsKey("meuObjetoId"))
{
//Recebe o ID informado
long id = Long.parseLong(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("meuObjetoId").toString());
//Busca o objeto e preenche os valores na pagina
meuObjeto = DAO.buscarMeuObjeto(id);
//Remove o atributo da sessão para utilizar novamente.
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("meuObjetoId");
}
}
catch (Throwable ex)
{
//Tratamento de exceção...
}
}
//Getters and setters...
Espero ter ajudado!
Até +!
Edit 1:
Estive lendo sobre a flash do JSF 2, e me parece que é um pouco instável ainda. Por exemplo:
[list]Se vc estiver fazendo sua navegação entre os beans através de getApplication().getNavigationHandler().handleNavigation(), o valor da flash é limpado antes da hora (veja http://stackoverflow.com/questions/2874929/does-navigationhandler-handlenavigation-clear-the-flash).
[/list]
[list]Se vc estiver fazendo redirect entre páginas em diretórios diferentes, a flash não funciona também (veja http://stackoverflow.com/questions/9148798/object-in-flash-scope-is-not-available-after-redirect).
[/list]
Então, acho que poderia pensar em outro escopo.
Até +!
[/quote]
Olá vinnysoft.
Eu já estou fazendo isso com o id do objeto no bean de listagem. Após clicar em editar, recupero o objeto a partir do seu id e o coloco no escopo de flash. Depois disso redireciono para a tela de edição e recupero o objeto na tela de edição com o flash. Já na tela de edição gostaria inserir um novo registro numa lista que esse objeto tem e para isso preciso recuperar a referência do objeto que estou editando no MB. Esse objeto está no escopo de flash e estou com dificuldade em recuperá-lo no bean de edição. Por algum motivo o flash está limpando.
Realmente eu já tinha lido sobre instabilidades do escopo de flash, mas esse escopo é necessário para que eu possa passar objetos durante o redirecionamento sem precisar usar escopo de sessão. Estou tendo dificuldades também por não estar utilizando nenhum framework como spring ou seam que abstraem alguns desses problemas.
Tentarei utilizar as estratégias que vocês me deram.
Agradeço a todos que se dispuseram a ajudar e colocarei aqui se o problema for resolvido assim que possível.