@PreDestroy não executa JSF 2.0

10 respostas
M

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

Configuro um
@ManagedBean
@ViewScoped
public class ControlerContacts .... // assim

    @PostConstruct
	public void init(){
		System.out.println("Iniciando objeto");
		
	}
	
	
	@PreDestroy
	public void destroy(){
		System.out.println("Destruindo objeto");
		
	}
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) */
http://semprejava.wordpress.com/

10 Respostas

L

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

M

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?

G

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.

M
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.

Fiz o teste sugerido, engraçado a cada requisição ele chama o metodo
@PreDestroy
	 public void destroy(){
		System.out.println("\n\n\n\n\n.................  Dessssssstroi ........... \n\n\n\n\n\n\n");
		
	}
mas eu não mudo de url... e quando mudo de URL ai ele não chama... parece haver erro nessa idéia...
G

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 ?!

M

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…

G

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.

R

Conseguiu resolver colega?
Estou com o mesmo problema

A

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

J
alcirBarros:
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
@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);
	}
	
}
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.

Criado 11 de outubro de 2011
Ultima resposta 8 de jan. de 2013
Respostas 10
Participantes 6