Como passar valores entre dois managed beans? [RESOLVIDO]

8 respostas
G

pessoal,

em uma tela de meu sistema implementei um filtro através de e consegui chegar em um único objeto persistido no banco. agora preciso pegar o id desse objeto e passar para outra tela (ou managed bean).

na lista de discussões do javasf me passaram um link para esse excelente post do BalusC a respeito de comunicação no JSF, mas não consegui resolver meu problema.

Preciso de ajuda!

os managed-beans em questão estão definidos no faces-config.xml em escopo de sessão
<managed-bean>
  <managed-bean-name>anamanRegisterMB</managed-bean-name>
  <managed-bean-class>anaman.mb.AnamanRegisterMB</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>anamanEquipmentMB</managed-bean-name>
  <managed-bean-class>anaman.mb.AnamanEquipmentMB</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
O trecho de código do managed bean anamanRegisterMB que tem a ação de salvar o id é:
public void passIdRegister() {
		System.out.println("registerCode: " + registerCode);
		rIL = ars.getRegisterIdListByDesc(registerCode);
		for (AnamanRegister reg : rIL) {
			System.out.println("reg.getIdRegister(): " + reg.getIdRegister());
			setRegisterId(reg.getIdRegister());
			System.out.println("registerId: " + registerId);
			Integer registerId = (Integer) getRegisterId();
			AnamanFacesUtil.setApplicationMapValue(
					"AnamanRegisterMB.registerId", registerId);
		}
		renderEquipTable();
	}
e no managed bean de destino, tenho o seguinte trecho de código:
public int getRegisterId() {
		Integer registerId = (Integer) AnamanFacesUtil.getApplicationMapValue("AnamanRegisterMB.registerId");
		return registerId;
	}
Eu também criei uma classe AnamanFacesUtil com base no post do BalusC para tentar resolver o problema, mas não deu certo.
package anaman.util;

import javax.faces.context.FacesContext;

public class AnamanFacesUtil {

    // Getters -----------------------------------------------------------------------------------

    public static Object getApplicationMapValue(String key) {
        return FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get(key);
    }

    // Setters -----------------------------------------------------------------------------------

    public static void setApplicationMapValue(String key, Object value) {
        FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().put(key, value);
    }

}

Como se resolve isso?

Obrigado,
Gustavo

8 Respostas

V

FacesContext context = FacesContext.getCurrentInstance(); ELResolver resolver = context.getApplication().getELResolver(); //Aqui vai o nome do seu Bean segundo o faces MeuJSFBean meuBean = (MeuJSFBean) resolver.getValue(context.getELContext(), null, "meuBean"); return meuBean.editEndereco(cliente);

Eu faço assim e funciona!
Tenta ai depois fala se deu certo.

G

vi-gb,

esse código vai aonde?

V

No bean que vai chamar o outro bean

G

Esse ELResolver é da tua implementação?

V
import javax.el.ELResolver;

Ele faz parte do el-api.jar

Desculpe se não ta bem explicado. :cry:

T

não é mais fácil colocar o objeto em session? já que seus beans estão em session?

G

Eu acabei conseguindo resolver com managed properties no faces-config.xml, assim:

<managed-bean> <managed-bean-name>anamanRegisterMB</managed-bean-name> <managed-bean-class>anaman.mb.AnamanRegisterMB</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>anamanEquipmentMB</managed-bean-name> <managed-bean-class>anaman.mb.AnamanEquipmentMB</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>anamanRegisterMB</property-name> <property-class>anaman.mb.AnamanRegisterMB</property-class> <value>#{anamanRegisterMB}</value> </managed-property> </managed-bean>

obrigado pelas dicas!

O

Excelente texto sobre comunicação em jsf: http://balusc.blogspot.com/2006/06/communication-in-jsf.html

Criado 10 de novembro de 2009
Ultima resposta 10 de nov. de 2009
Respostas 8
Participantes 4