Capturar um bean instanciado pelo JSF

fala galera

como posso capturar as informações de um determinado bean
por exemplo, um usuario loga no sistema

o proprio faces instancia um bean usuario

quero pegar essa instancia para efeito de filtragem de dados
desse determinado usuario

Se o seu bean tiver escopo de sessão, então o Faces instancia registra o objeto como um atributo de sessão.
Assim, você consegue capturar o bean e também pode instanciá-lo por conta própria.
Exemplo:

  public static UsuarioMB getUsuarioMB() {
	  Object o = getSessionAttribute("usuarioMB");
	  if ((o != null) && (o instanceof UsuarioMB)) {
		  return (UsuarioMB) o;
	  } else {
		  UsuarioMB umb = new UsuarioMB();
		  setSessionAttribute("usuarioMB", umb);
		  return umb;
	  }	  
  }

UsuarioMB é o meu ManagedBean e “usuarioMB” é o nome definido no faces-config.xml

O bean só é instanciado quando uma página acessa atributos dele. Por isso pode acontecer do seu bean não ter sido instanciado ainda e é por isso que eu testo se o atributo referente ao mb já foi setado e caso negativo, eu mesmo crio a instância e registro nos atributos de sessão.

Utilizo esta técnica com sucesso no servidor Glassfish. Nos outros servidores (JBoss, WebSphere, etc.) eu nunca testei, mas acredito que vá funcionar do mesmo jeito.

Segue o código dos métodos que uso para ler e gravar os atributos de sessão:

  public static Object getSessionAttribute(String attributeName) {
	try {
		ExternalContext ec = getExternalContext();
		if (ec != null){
			Map attrMap = ec.getSessionMap();	
			if (attrMap != null) {
				return attrMap.get(attributeName);
			} else {
				return null;
			}
		} else {
			return null;
		}
	} catch (Exception e) {
	  	e.printStackTrace();
	   	return null;
	}
  }
  @SuppressWarnings("unchecked")
  public static void setSessionAttribute(String attributeName, Object attributeValue) {
		try {
			ExternalContext ec = getExternalContext();
			if (ec != null){
				Map attrMap = ec.getSessionMap();	
				if (attrMap != null) {
					attrMap.put(attributeName, attributeValue);
				} 
			} 
		} catch (Exception e) {
		  	e.printStackTrace();
		}
  }
  public static ExternalContext getExternalContext() {
	try {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		if (facesContext == null) {
			return null;
		} else {
			return facesContext.getExternalContext();
		}
	} catch (Exception e) {
    	e.printStackTrace();
    	return null;
    }    
  }

A classe ExternalContext do JSF também permite acessar o Map de atributos da requisição e de aplicação, assim você pode adaptar esta técnica se o seu bean tiver um destes escopos.

cara exatamente isso
muito obrigado, ja funcionou
abraço

So para deixar o que me ocorreu. Quando utilizamos outro framework de JSF por exemplo o myfaces esses codigos de recuperar o managed bean em outro da problema. Eu utilizo a implementacao padrao do jsf que vem no netbeans. Quando eu quero recuperar o objeto da sessao ou o managed bean eu utilizo o seguinte codigo:

private Object getBeanController(FacesContext context, String string) { //string é o nome registrado no faces-config.xml
        return context.getELContext().getELResolver().getValue(context.getELContext(), null, string);
}

//Aqui é para recuperar parametros da tela quando utilizo metodos void para uso com ajax
private Object recuperarParametroDaTela(ActionEvent event, String objeto) {
        UIComponent comp = (UIComponent) event.getComponent();
        UIParameter param = (UIParameter) comp.findComponent(objeto);
        return param.getValue();
}

//Aqui seria como eu chamo outro managed bean.
public String responderPedido() {
        FacesContext context = FacesContext.getCurrentInstance();
        PedidoassociadoController pac = (PedidoassociadoController) getBeanController(context, "pedidoassociado");
        ...
}

//Aqui quando preciso recupera algo que esta em sessao
private FacesContext getContext() {
        return FacesContext.getCurrentInstance();
}

private HttpSession getSession() {
        return (HttpSession) getContext().getExternalContext().getSession(false);
}

private Object getObjetoSessao(String nome) {
        return (Object) getSession().getAttribute("nome");
}

Esta aqui mais uma forma de utilizarmos.

Existe uma forma de fazer isso via injeção, com o managed property no faces-config.xml

Ex:


<faces-config>
    ..........
    <managed-bean>
        <managed-bean-name>outroBean</managed-bean-name>
        <managed-bean-class>
            pacote.outroBean
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
        <managed-bean-name>meuBean</managed-bean-name>
        <managed-bean-class>
            pacote.meuBean
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>outroBean</property-name>
            <property-value>#{outroBean}</property-value>
        </managed-property>
    </managed-bean>
</faces-config>

ai você declara a variável no seu bean e o JSF faz a injeção.

Ex:


public class MeuBean{

private OutroBean outroBean; 

public MeuBean(){
}

public OutroBean getOutroBean(){
return this.outroBean;
}

public void setOutroBean(OutroBean outroBean){
this.outroBean = outroBean;
}

}

Fazendo isso você não precisa usar código nenhum para instanciar o bean, o JSF faz isso pra você.

Abraço