[RESOLVIDO] Manter managed bean (request scoped) mesmo com redirect

Pessoal, eu PRECISO manter um managed bean com seus dados mesmo após um redirect.

Ativo um método no managed bean, ele inicializa as propriedades e faz um REDIRECT (return “/tal/pagina.jsf?faces-redirect=true”) mas eu preciso dos dados que foram inicializados no método do managed bean.

O <t:saveState/> não me ajuda pois ele não salva os dados ao fazer um REDIRECT.

E não posso colocar como session scoped pois vai consumir mais recursos do que preciso.

Alguma sugestão?

Desde já agradeço

JSF 1 ? JSF 2 ? (se sim, @ViewScoped) ?

JSF 2, Mojarra.

Pra ficar mais claro pq eu tenho que fazer assim vou resumir: to usando fullcalendar do jQuery. Quando o usuário clica em um dia uma função JavaScript é chamada. Essa função chama um managed bean. Para que a função em JS chame um MB eu to usando a4j:jsFunction/, atributo action igual ao método a ser chamado no MB e os a4j:param/ atrituto assignTo associado a cada propriedade do MB. O método no MB retorna uma String com a URL da página para adicionar o evento. Segundo a documentação do a4j:jsFuntion/ eu preciso fazer um REDIRECT, pois um FORWARD não funciona, então eu retorno no método do MB return “/minha/pagina.jsf?faces-redirect=true”. Nisso perco o MB configurado.

A “solução” que achei foi armazenar um objeto com as informações do evento em HttpSession e verificar se esse objeto existe no construtor da classe de evento.

Se existir eu leio de HttpSession, senão, crio um novo.

Vlw.

[quote=jfb0101]A “solução” que achei foi armazenar um objeto com as informações do evento em HttpSession e verificar se esse objeto existe no construtor da classe de evento.

Se existir eu leio de HttpSession, senão, crio um novo.
[/quote]
Realmente essa até então é a única solução que vejo.

O @ViewScope não rola pois ao sair da tela os dados são perdidos, mesmo que você redirecione para a mesma página.

Existe um modo de fazer os ViewScope não apagar os dados, mas naõ funciona com redirect. Vc teria que retornar null em uma action que tenha uma String como retorno. [=

Pois é. Se não fosse pela obrigatoriedade do REDIRECT seria mais simples.

:?

No jsf 2 existe um escopo novo chamado flash que “sobrevive” a um redirect. Tem um exemplo aqui:

http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/

também é legal ler o javadoc:

http://docs.oracle.com/javaee/6/api/javax/faces/context/Flash.html

[]'s

[quote=rogeriopaguilar]No jsf 2 existe um escopo novo chamado flash que “sobrevive” a um redirect. Tem um exemplo aqui:

http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/

também é legal ler o javadoc:

http://docs.oracle.com/javaee/6/api/javax/faces/context/Flash.html

[]'s[/quote]
Rapaz, esqueci completamente dele. E olha q eu já escrevi um post sobre isso.

Foi mau a falha aí. JSF Exibindo Objeto e Mensagens após Redirect

Com “a pequena quantidade de conhecimento” que precisamos ter na nossa área é normal esquecermos :slight_smile:

[]'s

Galera, muito obrigado pela ajuda. Vou testar e posto o resultado aqui.

Valeu!

Galera, agradeço a todos pela ajuda e fiquei contente em saber desse novo recurso do JSF 2, o Flash Scope, tenho certeza que vou precisar usá-lo bastante.

Mas eu acho, que neste meu caso em particular, o flash scope não vai ajudar. Ou talvez ajude, se eu puder checar pelo managed bean dentro do código java.

Por exemplo, no método do EventoBean que pede para gerar um novo evento e redireciona para a página estou fazendo assim:

SessaoUtil.setRequestAttribute(FacesContext.getCurrentInstance(), this, "eventoBean");
            
            
return "/restrito/eventos/adicionar_evento.jsf?faces-redirect=true";

Ou seja, estou guardando o próprio eventoBean na HttpSession.

No construtor padrão de EventoBean eu faço o seguinte:

EventoBean eventoBean = (EventoBean) SessaoUtil.getRequestAttribute(FacesContext.getCurrentInstance(), "eventoBean");

        if (eventoBean != null ) {
            this.dataInicioConsulta = eventoBean.getDataInicioConsulta();
            this.horaInicioConsulta = eventoBean.getHoraInicioConsulta();
            this.consultaObrigatoria = eventoBean.isConsultaObrigatoria();
            SessaoUtil.removeRequestAttribute(FacesContext.getCurrentInstance(), "eventoBean");
        }

Ou seja, eu posso chamar o método novoEvento() de outros lugares que não serão necessariamente redirects e então não terei nada a manter.

Olhei a documentação de Flash e vi que ela possui 8 métodos, mas nenhum que permita verificar se existe o respectivo objeto na flash e eu preciso desse teste para não deixar a coisa presa demais e ter mais flexibilidade.

Nesse caso aí de cima, nem sempre os dados de data e hora serão informados na requisição anterior.

O que vocês acham?

Obrigado a todos.

Flash funciona como se fosse um map.

Você poderia fazer assim:

[code]Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

if(flash.containsKey(“MEU_OBJETO”)){
System.out.println(“achei”);
} else{
System.out.println(“forever alone”);
}[/code]

Ô rapaz, é mesmo, ele implementa Map!!!

Agora problema resolvido!

Muito obrigado!

dá uma olhada nesse artigo,ensina como manter o valor do managedbean em viewScope mesmo após um redirect

[quote=rjpereira1000000]dá uma olhada nesse artigo,ensina como manter o valor do managedbean em viewScope mesmo após um redirect

http://blog.gilliard.eti.br/2010/11/como-trabalhar-com-viewscope-e-page/[/quote]Aqui também: JSF Exibindo Objeto e Mensagens após Redirect. :stuck_out_tongue: