@PreDestroy não executa JSF 2.0

Bom dia Gujeiros,
Estou usando JSF 2.0 com PrimeFaces 2.2.1.

Configuro um

[code]@ManagedBean
@ViewScoped
public class ControlerContacts … // assim

@PostConstruct
public void init(){
	System.out.println("Iniciando objeto");
	
}


@PreDestroy
public void destroy(){
	System.out.println("Destruindo objeto");
	
}[/code]

O metodo init() é executado
o destroy() não, nunca…
Alguém sabe o que devo fazer para que isso funcione…

será que é preciso alguma configuração extra no faces-config.xml ou no web.xml?
Dicas, materiais são bem vindos…

Já fiz muitas buscas no google, mas, até agora nada que me resolvesse isso

aqui tem um exemplo igual eu acho…
/* chamado quando outra view for chamada através do UIViewRoot.setViewId(String viewId) */

Voce esta indo para uma outra pagina para ver se esta chamando o metodo @PreDestroy?

Sobre a questão de configuração extra, não precisa não!

Outra coisa tente mudar de pagina e depois entrar em uma outra pagina que faça uso desse bean.

Acho que ele só é chamado quando uma outra pagina usa o mesmo bean, quando o escopo esta View

Sim, estou indo pra outra pagina…

Na verdade não é um Bean, é uma ManagedBean…

será que não tem como fazer ele executar assim que é trocado a URL?

Para você fazer um teste pode colocar @ResquestScoped para ver se ele vai chamar mesmo o preDestroy.

Realmente não precisa de nada além da anotação para este método ser chamado quando irá morrer o Bean.

[quote=guilhermehkr]Para você fazer um teste pode colocar @ResquestScoped para ver se ele vai chamar mesmo o preDestroy.

Realmente não precisa de nada além da anotação para este método ser chamado quando irá morrer o Bean.[/quote]

Fiz o teste sugerido, engraçado a cada requisição ele chama o metodo[code]
@PreDestroy
public void destroy(){
System.out.println("\n\n\n\n\n… Dessssssstroi … \n\n\n\n\n\n\n");

}[/code]

mas eu não mudo de url… e quando mudo de URL ai ele não chama…
parece haver erro nessa idéia…

Coloque mais informações para nós!
Claro, se puder.

Se você colocou escopo de request e funcionou, irá funcionar com viewScoped.
Me diga, você esta utilizando navegação do JSF ?
Implicita ou explicita ?!

Isto no seu conceito esta certo Guilherme?

Pelo que eu entendo eu uso é navegação implicita, mas uso os dois tipos,
também uso o PrimeFaces 2.2.1 que nesse caso é o que faz chamadas ajax, mudando (atualizando) três lugares da pagina,
dentro do template, o que ele muda? Muda a url, o titulo da pagina, o conteúdo especifico daquele usuário.

Também isso é mapeado por um filter, que verifica se tal usuário tem acesso ou não…
quando não ele redireciona, mas nesse caso o usuário em questão é o admin do sistema e tem acesso a tudo…

Guilherme suas perguntas pra mim parece ter sentido…
mas não consegui tirar proveito delas ainda…

agradeço se você puder dar mais algumas explicações…

Bom dia,

Para mim faz sentido o ManagedBean passar pelo método @PreDestroy quando você tiver feito qualquer requisição ajax, CLARO se ele estiver erm escopo de requisição, já se ele estiver com o escopo de visão, não deverá passar, somente quando navegar.
Eu perguntei sobre a navegação, pois a uns dois meses atrás tive um problema parecido e a causa era ter utilizado navegação implicita, por isso voltei a usar a explicita, mesmo no JSF 2.0.
Sem contar que no projeto atual nos NÃO utilizamos a navegação do JSF e sim fazemos a navegação total por javascript (sei que é loucura, mas é pedido do cliente) e com isto não temos morte dos nossos beans.

Olha, eu não sou o melhor nisto, mas posso arriscar mais um palpite:

  • Já que esta utilizando JSF 2.0 tente utilizar o ajax nativo do framework, o projeto que mexi a dois meses atrás tive problemas quanto a interação do PrimeFaces com JSF, neste sentido de ajax e afins.

Qual foi a minha solução: Colocar todos os componentes, ou quase todos, do PrimeFaces com ajax =“false” e utilizar <f:ajax> do JSF.

Por favor poste o que aconteceu depois deste teste.
Desculpe pela falta de opções de solução.

Conseguiu resolver colega?
Estou com o mesmo problema

Estou procurando a resposta pra essa pergunta, seria muito bom se alguns de nossos amigos de nivel mais alto pudessem nos ajuda

Para que um método anotado com @PreDestroy seja executado, ou seja o @ManagedBean seja destruido e necessário que a requisição
para esta navegação seja feitra seja feita via POST através de um commandLink ou commandButton por exemplo.

ManagerBean

[code]
@ManagedBean
@ViewScoped
public class HomeController implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -4616686294701165340L;

@PostConstruct
private void init() {
	System.out.println("==> init: "+this);
}

@PreDestroy
private void end() {
	System.out.println("==> end: "+this);
}

}[/code]

Página 1

<h:form>
  Bean <h:outputText value="#{homeController}"/><br/>
  Inicio <h:commandLink action="segunda.xhtml?faces-redirect=true">Segunda</h:commandLink>
</h:form>

Página 2

<h:form>
  Bean <h:outputText value="#{homeController}"/><br/>
  Inicio <h:commandLink action="primeira.xhtml?faces-redirect=true">Primeira</h:commandLink>
</h:form>

Dessa forma ao clicar nos link’s o método end sempre será executado.