JSF - SessionScope nos beans!

Bom dia!

Galera, estou com um problema com Spring e JSF…
Isto foi conversado nos seguintes posts: Aqui e Aqui.

Bom, como workaround para estes problemas eu estou pensando em deixar todos os meus beans sessionScoped
e depois tirá-los da sessão… O problema é: como fazer isso?

Eu sei quando eu quero tirá-lo da sessão, vamos a um exemplo…
pagina1.xhtml
pagina2.xhtml
pagina3.xhtml

Digamos que a pagina 1 tem referência ao MB #{myBean}

Se o cara navegar para pagina2.xhtml que também possui referencia ao mesmo MB,
então eu quero que ele continue… E idem se ele navegar da pagina2 para pagina3…
Sempre se o destino tiver referencia ao MB.

Se o cara for navegar da pagina1 para a pagina4 que não tem nenhuma referencia a ele #{myBean},
então eu posso destruí-lo.

Alguém pode me ajudar com isso?

Bom dia, sem conhecer muito do seu problema vou te dar duas sugestões, que espero que possam te ajudar.

1º - Você pode implementar um managedbean com escopo customizado (@CustomScoped) nesse escopo vc é quem define o momento em que o managedbean é iniciado e finalizado, vc pode mantê-lo entre diversas requisições e paginas e finalizá-lo tb conforme for sua necessidade.

2º - Como me parece que vc já implementou seu managedbean com escopo de view (me perdoe se estiver enganado), neste caso vc como vc usa facelets, fica fácil definir que seu cadastro abra em um dialogo modal diretamente sobre sua listagem, mantendo assim sua navegação em apenas uma pagina ( a da listagem com o dialogo modal de cadastro sobre ela).

Como disse ñ conheço seu problema a fundo, mas deixo ai minha pequena colaboração.

Boa sorte, abraço!

Obrigado pela resposta cara!!

Vamos as respostas!

[quote=thiagocg]1º - Você pode implementar um managedbean com escopo customizado (@CustomScoped) nesse escopo vc é quem define o momento em que o managedbean é iniciado e finalizado, vc pode mantê-lo entre diversas requisições e paginas e finalizá-lo tb conforme for sua necessidade.
[/quote]
Cara eu acho que isso seria o ideal. O problema é que estou usando o Spring. Dá para usar o @Component do Spring e a anotação do JSF junto?
Se isto funcionar, vou ler sobre o CustomScoped. Outra pergunta, terei um escopo diferente pra cada tela?? Aí complica de mais !!!

Cara eu tentei, mas o view não funcionou. Então para deixar funcionando a arquitetura do sistema inteiro, eu teria que ter um escopo MAIOR que ViewScoped e MENOR que SessionScoped. O meu MB só poderá ser destruído quando a pagina atual/ou próxima página não fazer mais referencia a ele.
Sim, eu uso facelets, mas eu não faço com dialogo na mesma página. Tenho outra página separada para fazer a inserção/edição dos campos!
Até mesmo pq, o viewScoped não funciona com Spring, como eu disse!

Sobre fazer que nem eu coloquei originalmente no tópico, tem alguma sugestão?
Tipo fazer um filtro para ver qual a próxima página que ele vai acessar e matar o MB caso ele nao seja referenciado lá?
Algo do tipo?

Abraçoss!
No aguardo do feedback!
vlww

d34d, seria uma opção configurar isso via filter no web.xml?

<filter>  
    <filter-name>SeuFilter</filter-name>  
    <filter-class>  
        br.com.exemplo.filter.PaginasFilterFilter  
    </filter-class>  
</filter>  
  
<filter-mapping>  
    <filter-name>SeuFilter</filter-name>  
    <url-pattern>/seguro/*</url-pattern>  
</filter-mapping>  

Grande Andre!
Então cara, eu estou pensando em criar um filtro mesmo…
Problemas: nunca criei um filtro

Algumas duvidas… usando filter…

  • tem como eu ver se a view atual / ou a proxima view possui referencia ao BEAN TAL?
  • como eu nao sei qual que é o BEAN TAL, então tenho que varrer todos os objetos da sessão, e ir vendo quais estao na proxima view e tirar o resto! … O problema é que posso remover objetos que não são managedBeans…
  • quando eu acesso o bean pelo nome da classe tipo GrupoController = #{grupoController} , como que é o key dele na session? “grupoController” mesmo? Pq se for, posso fazer um indexOf “Controller” diferente de 0…

valeuu pela ajuda!

Cara, para invalidar um session é bem facil, e provavelmente você já saiba como fazer, só não sabe a sintaxe :smiley:
Dentro do teu SessionScoped cria esse método logout

public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "pagina.xhtml?faces-redirect=true";
}

para capturar a sessão no http é com este código:

HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession();
//nada te impede de utilizar o session.invalidate();
session.invalidate();

para utilizar o filter é mais facil ainda, você só coloca aquele código que eu te passei no post passado e coloca as páginas que vão ter a restrição em caad mapping:

<filter>    
    <filter-name>SeuFilter</filter-name>    
    <filter-class>    
        br.com.exemplo.filter.PaginasFilterFilter    
    </filter-class>    
</filter>    
    
<filter-mapping>    
    <filter-name>SeuFilter</filter-name>    
    <url-pattern>/seguro/pagina1.xhtml</url-pattern>    
</filter-mapping>  

<filter-mapping>    
    <filter-name>SeuFilter</filter-name>    
    <url-pattern>/seguro/pagina3.xhtml</url-pattern>    
</filter-mapping>  

<filter-mapping>    
    <filter-name>SeuFilter</filter-name>    
    <url-pattern>/seguro/pagina4.xhtml</url-pattern>    
</filter-mapping>  

mas é aquilo também, você não precisa matar a sessão, deixa ativa para caso o usuário queira retornar para o local, senão terá que reautenticar.

Cara, nestes links abaixo esta a solução tanto para quem usar SPRING quanto para quem usa CDI.

http://www.guj.com.br/java/257228-resolvido-como-manter-o-estado-de-um-managedbean-entre-duas-paginas-com-jsf-2

http://lindbergframework.blogspot.com.br/2012/02/como-manter-o-estado-de-um-managedbean.html

Espero que te ajude. Eu mesmo foi quem implementou e a utilizo em varios projetos.

[quote=lindberg713]Cara, nestes links abaixo esta a solução tanto para quem usar SPRING quanto para quem usa CDI.

http://www.guj.com.br/java/257228-resolvido-como-manter-o-estado-de-um-managedbean-entre-duas-paginas-com-jsf-2

http://lindbergframework.blogspot.com.br/2012/02/como-manter-o-estado-de-um-managedbean.html

Espero que te ajude. Eu mesmo foi quem implementou e a utilizo em varios projetos.[/quote]

Cara eu já testei teu framework :frowning:
Não funcionou pra mim…
Primeiro que ele modifica o link de acesso
Depois que deu um pau no Filtro do Hibernate… Ai tirei ele fora e ‘rodou’ pelo menos…
ai depois disso cara, quando eu acesso a minha pagina com @AccessScoped da um erro bruto enorme
na view…
É algo sobre orchestra

vlw pela ajuda!

Cara, o problema nao esta no framework, pois o utilizo sem problemas em diversos projetos, inclusive outras pessoas aqui do forum tb o integraram e utilizam sem problema algum. Você nao esta integrando e o plugando da forma correta em seu projeto. Deve estar faltando alguma configuração, etc…

Com relação a mudar a URL de acesso, ele nao muda nem manipula URL nenhuma. O que é feito é adicionar um parametro de ID da conversação de modo a mapear o contexto conversacional do request atual.

Com relação ao pau no filtro do hibernate que vc citou vc não deve ter lido a documentação que te passei nos links sobre a solução, pois la fala sobre declarar um filtro do lindbergframework-myview, que está descrito abaixo. Este filtro estende o filtro padrão de “opensessioninview” do spring. Então na verdade vc deve usar o que eu digo na documentação.

Da mesma forma, como me reportou na MP que me enviou, vc esta tendo ClassNotFoundException, isso é falta de lib que vc nao ta colocando e que o myview depende. Entao leia a documentação por completo, faça a configuração passo a passo e caso ainda assim tenha problemas, reporte aqui, junto com detalhes do erro, stacktrace, etc… para que possamos ajuda-lo.

De ante-mao ja te falo que é muito rapido, facil e simples colocar o lindbergframework-myview e utilizar os escopos que ele prover, em um projeto que utiliza SPRING +JSF e que esteja devidamente configurado.

Da mesma forma vc tem que adicionar uma linha de configuração no seu XML do spring, vc fez isso? Abaixo tb mostro.

FILTRO:

<filter>
       <filter-name>hibernateFilter</filter-name>
       <filter-class>org.lindbergframework.orm.hibernate.support.MyViewScopesOpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
       <filter-name>hibernateFilter</filter-name>
       <url-pattern>/*</url-pattern>
</filter-mapping>

Linha de XML no arquivo do spring que deve ser adicionada:

<import resource="classpath:/META-INF/myview-spring-init.xml"/>

Cara com certeza é isso!
Falta de configuração!

Vou ver o que arrumo e posto aqui pras outras pessoas que tiverem o mesmo problema!
valeuu pelo suporte