Passar sempre pelo construtor de um BEAN em JSF

Galera,

No meu jsp, ao clicar em um botão, estou chamando um método no meu bean:

<ice:commandButton value="Avancar" action="#{pesquisaAvancada.avancar}" styleClass="botao" />

Trecho do faces-config:

<managed-bean> <managed-bean-name>pesquisaAvancada</managed-bean-name> <managed-bean-class>br.com.mobup.previdencia.jsf.beans.PesquisaAvancadaBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

Acontece que o costrutor da classe PesquisaAvancadaBean, é acionado apenas na 1ª vez. Gostaria que sempre que fosse chamado ele passasse pelo construtor, alguém tem alguma ideia ai ?

Obrigado a todos

Pelo que entendi você quer criar várias instâncias do seu bean em memória? É isso?

Estranho. Se o ManagedBean esta no Request, ele deveria passar sempre pelo construtor.

Bom, uma saída seria você retirar o MB da sessão ( se ele estiver por lá ).

FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().remove("nomeDoSeuMB");

O problema é que você está usando a implementação do Icefaces, e por padrão, ele é FULL AJAX. Assim, o construtor será executado realmente apenas na primeira vez que o MBean for executado.

Deixa eu explicar melhor:

O botão:

<ice:commandButton value="Avancar" action="#{pesquisaAvancada.avancar}" styleClass="botao" />

Ira chamar este método no meu bean PesquisaAvancadaBean:

	public String avancar(){
                //Neste ponto eu coloco um objeto na sessão
		return "avancar";
	}

Este botão “avançar” ira chamar a página BeneficioSlc.jspx:

	<navigation-rule>
		<display-name>pesquisaAvancada</display-name>
		<from-view-id>/RequerintePsqs.jspx</from-view-id>
		<navigation-case>
			<from-outcome>avancar</from-outcome>
			<to-view-id>/BeneficioSlc.jspx</to-view-id>
		</navigation-case>
	</navigation-rule>

Este BeneficioSlc.jspx utiliza o Bean :

	<managed-bean>
		<managed-bean-name>selecionaBeneficio</managed-bean-name>
		<managed-bean-class>br.com.mobup.previdencia.jsf.beans.SelecionaBeneficioBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>

Na primeira vez que eu chamo o avançar, ele entrar no construtor do SelecionaBeneficioBean, mas na segunda vez não. Eu preciso que ele sempre entre no construtor para pegar o que eu deixei na sessão no metodo que ja citei acima:

	public String avancar(){
                //Neste ponto eu coloco um objeto na sessão
		return "avancar";
	}

deu pra entender melhor? :smiley:

Obrigado galera

Ninguem mais …rs

Mas não tem um jeito dele sempre passar pelo construtor. Se não conseguir vou testar o exemplo que o amigo acima citou, de tirar o MB da memória. Estou fazendo este projeto em casa, por isso ainda não testei, hoje a noite irei fazer os teste.

Aconselho você fazer essa pergunta no fórum do IceFaces (e depois é claro, postar a resposta deles aqui :lol: ).
O IceFaces tem uns comportamentos diferentes mesmo, fazer o que

[quote=Jair Rillo Junior]Aconselho você fazer essa pergunta no fórum do IceFaces (e depois é claro, postar a resposta deles aqui :lol: ).
O IceFaces tem uns comportamentos diferentes mesmo, fazer o que[/quote]

Valeu pelo conselho Jair :thumbup:

Bom galera, resolvi o problema, ficou meio “gato”, mas foi o que deu pra fazer:

Criei um método:

public void tirarBeanDaSessao(String nomeBean) { String expr = "#{" + nomeBean +"}"; ValueBinding vb = FacesContext.getCurrentInstance().getApplication().createValueBinding(expr); vb.setValue(FacesContext.getCurrentInstance(), null); }

e no botão avançar eu coloquei:

	public String avancar(){
		...
				tirarBeanDaSessao("selecionaBeneficio");  
				return "avancar";
	}

Agora a próxima página jsp sempre esta entrando no construtor SelecionaBeneficioBean . . .

Obrigado a todos pela a ajuda :thumbup: