Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

ViewScoped sendo criado muitas vezes versão 2

Referência: ViewScoped sendo criado muitas vezes

Ainda hoje, com aplicações web com JSF 2.3 mais recentes (Wildfly e Thornail mais recentes, versões estáveis) esse problema do bean com @ViewScoped ainda acontece.

Esse artigo do Rafael Ponte detalha muito bem esse problema: http://www.rponte.com.br/2013/12/02/viewscoped-o-ovo-e-a-galinha/#comment-149441

Esses dois repositórios a seguir que são uma demostração de um cadastro CRUD apresenta esse problema "chicken/egg issue": https://github.com/cassiusvm/cadastrocrud e https://github.com/cassiusvm/cadastrocrud-thorntail

Os beans UpdateBean e DeleteBean carregam a pessoa selecionada (através de escopo flash) e mostra suas informações na janela para atualização e exclusão respectivamente, quando fazia refresh da página, as informações da pessoa sumiam porque o método com @PostConstruct era chamado novamente e assim atribuía null ao objeto Person por causa do escopo flash que não existia mais.

Resolvi esse problema parcialmente, colocando novamente a pessoa selecionada em escopo flash, como pode ser visto no código atual do método init() com anotação @PostConstruct.

Isso vai contra o conceito/especificação da anotação @ViewScoped que deveria manter o bean carregado estando esse sempre na mesma view.

Essa publicação é uma outra resposta para o tópico original e também um questionamento se outros desenvolvedores também passaram por esse problema e acharam uma solução ou não.

1 resposta
solução

Eu estava enganado. Quando se faz um refresh da página é como fazer uma chamada GET assim uma nova instância do bean @ViewScoped é criada e a anterior vai para a lixeira (Garbage Collector) . Isso é diferente de um postback, nesse caso o estado do objeto @ViewScoped é mantido.